首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

今天的网易笔试让小弟我很爱伤

2012-02-10 
今天的网易笔试让我很爱伤函数实现将网址进行如下操作www.google.com转成com.google.www 及mail.netease.c

今天的网易笔试让我很爱伤
函数实现将网址进行如下操作
www.google.com转成com.google.www 及mail.netease.com转成com.netease.mail

不允许用STL,空间为0(1)

C/C++ code
void reverse(cha * ptr){}


伤不起呀,大家来看看!!!

[解决办法]
先把整个字符串倒转,再倒转用.隔开的子串
[解决办法]
++

探讨

先把整个字符串倒转,再倒转用.隔开的子串

[解决办法]
也不是想象的那样困难,它为什么不允许用stl,大家应该可以想到!
所以我们自己定义一个中间处理类就可以了!
C/C++ code
#include<iostream>using namespace std;class rAccess_ptr{public:    rAccess_ptr(char* ptr);    ~rAccess_ptr();    char getAt(int i);    char operator [] (int i);    char& operator* () const  { return *m_pCurPtr; }    char* operator-> () const { return m_pCurPtr; }    char* operator ++ ();    char* operator ++ (int);    char* operator -- ();    char* operator -- (int);    friend ostream& operator << (ostream& os, rAccess_ptr ptr);private:    char* m_pFirst;    char* m_pLast;    char* m_pCurPtr;};rAccess_ptr::rAccess_ptr(char* ptr){    m_pFirst = ptr+strlen(ptr)-1;    m_pLast = ptr;    m_pCurPtr = m_pFirst;}rAccess_ptr::~rAccess_ptr(){    m_pFirst = NULL;    m_pLast = NULL;    m_pCurPtr = NULL;}char rAccess_ptr::getAt(int i){    if (m_pFirst-m_pLast < i)        return NULL;    return *(m_pFirst-i*sizeof(char));}char rAccess_ptr::operator [](int i){    return getAt(i);}char* rAccess_ptr::operator++(){    return --m_pCurPtr;}char* rAccess_ptr::operator++( int ){    char* tmp = m_pCurPtr;    --m_pCurPtr;    return tmp;}char* rAccess_ptr::operator--(){    return ++m_pCurPtr;}char* rAccess_ptr::operator--( int ){    char* tmp = m_pCurPtr;    ++m_pCurPtr;    return tmp;}ostream& operator<<( ostream& os, rAccess_ptr ptr ){    char* tmp = ptr.m_pFirst;    while (tmp >= ptr.m_pLast)        os<<*(tmp--);    return os;}int main(){    char str[] = "hello";    rAccess_ptr access(str);    cout<<str<<endl;    cout<<access<<endl;    return 0;}
[解决办法]
C/C++ code
#include <stdio.h>#include <string.h>/*   把字符串整体reverse */void _reverse(char *begin, char *end){    while(end > begin){        char tmp = *end;        *end = *begin;        *begin = tmp;        begin ++;        end --;    }}/*   实现 */void reverse(char *str){    if(str == NULL) return;    char *end = str + strlen(str);    end--;    char *firstdot;     char *seconddot;    _reverse(str, end);//先整体_reverse    firstdot = strchr(str, '.');    seconddot = strchr(firstdot+1, '.');    _reverse(str, firstdot-1);//_reverse第一个'.'之前的部分    _reverse(firstdot+1, seconddot-1);//_reverse两个'.'之间的部分    _reverse(seconddot+1, end);//_reverse第二个'.'之后的部分}int main(){    char a[] = "www.google.com";    char b[] = "mail.netease.com";    reverse(a);    printf("%s\n", a );    reverse(b);    printf("%s\n", b );    return 0;}
[解决办法]
用C写了一个
C/C++ code
#include<stdio.h>#include<stdlib.h>#include<assert.h>void reverse(char *begin, char *end){    char tmp;    assert(NULL != begin && NULL != end);    while (begin < --end)    {        tmp = *begin;        *begin = *end;        *end = tmp;        ++begin;    }}char *func(char src[]){    char *p = src;    char *pstart;    char *pend;    assert(src != NULL);    while (*p)    {        pstart = p;        while (*p != '.' && *p)            p++;        pend = p;        if (*p == '.')            ++p;        reverse(pstart, pend);    }    reverse (src, p);    return src;}int main(){    char google[] = "www.google.com";    char netease[] = "mail.netease.com";    printf("%s\n", func(google));    printf("%s\n", func(netease));    system("pause");    return 0;} 


[解决办法]
以.为分隔翻转每个单词,然后翻转整个字符窜就可以了。
[解决办法]

C/C++ code
#define min(a,b)  (((a) < (b)) ? (a) : (b))void reverse(char * ptr){        char* firstP = strchr(ptr,'.');    char* lastP = strrchr(ptr,'.');    *firstP = '\0';    int firstlen = strlen(ptr);    int lastlen = strlen(++lastP)-1;    firstlen = min (firstlen,lastlen);    *firstP = '.';        int count = 0;    while (count<=firstlen)    {        *ptr = (*ptr)^(*lastP);        (*lastP) = (*lastP)^(*ptr);        *ptr = (*ptr)^(*lastP);        ptr++;        lastP++;        count++;    }}int _tmain(int argc, _TCHAR* argv[]){    char urlstr[] = "www.google.com";    reverse(urlstr);    printf(urlstr);    return 0;}
[解决办法]
C/C++ code
    int nLen=strlen(ptr);    char* ptrTemp=ptr+nLen;//将'\0'字符作为容器    char* ptrTail=ptr+nLen-1;//尾指针    char* ptrHead=ptr;//头指针    int nHeadPtDistanceOfHead=0;//前'.'距离头部的距离    int nTailPtDistanceOfEnd=0;//后'.'距离末尾的距离    int nMin=0;//得到距离最小值    while('.'!=*ptrTail)//指向尾'.'    {        ptrTail--;        nTailPtDistanceOfEnd++;    }    ptrTail++;//指向'.'之后    while('.'!=*ptrHead)    {        ptrHead++;        nHeadPtDistanceOfHead++;    }    ptrHead=ptr;//恢复指向字符串头    nMin=min(nTailPtDistanceOfEnd,nHeadPtDistanceOfHead);//得到字符串最小的长度    for(int i=0;i<nMin;i++)//交换最小区域    {        *ptrTemp=*ptrHead;        *ptrHead=*ptrTail;        *ptrTail=*ptrTemp;        ptrHead++;        ptrTail++;    }    if(nHeadPtDistanceOfHead>nTailPtDistanceOfEnd)//将剩下区域进行挪移填充        for(int i=0;i<abs(nTailPtDistanceOfEnd-nHeadPtDistanceOfHead);i++)        {            *ptrTemp=*ptrHead;            for(char* p=ptrHead;p!=ptrTail;p++)                *p=*(p+1);            *ptrTail=*ptrTemp;        }    else        for(int i=0;i<abs(nTailPtDistanceOfEnd-nHeadPtDistanceOfHead);i++)        {            *ptrTemp=*ptrTail;            for(char* p=ptrTail;p!=ptrHead;p--)                *p=*(p-1);            *ptrHead=*ptrTemp;        }    *ptrTemp='\0'; 

热点排行