今天的网易笔试让我很爱伤
函数实现将网址进行如下操作
www.google.com转成com.google.www 及mail.netease.com转成com.netease.mail
不允许用STL,空间为0(1)
void reverse(cha * ptr){}
#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;}
[解决办法]
#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写了一个
#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;}
[解决办法]
以.为分隔翻转每个单词,然后翻转整个字符窜就可以了。
[解决办法]
#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;}
[解决办法]
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';