Offer题4 替换空格&常量字符串和字符串数组

来源:互联网 发布:用js实现手机号 编辑:程序博客网 时间:2024/05/21 06:00
  1. 替换空格(P44)(面试题四) 
  2. 常量字符串和字符串数组(P42)

       请高人指点:书上面试题4的代码好像在字符串末尾的'\0'上有瑕疵,我认为下面这一句右边应该+1,即char字符串末尾的‘\0’没有计入newLength,但是末尾的指针却是从‘\0’开始复制的。
int newLength = originalLength + numberOfBlank * 2;

1.替换空格(P44) (面试题4)
题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy”,则输出"We%20are%20happy."。
注意点如下:
  • 要分清楚是否允许创建新的字符串,允许的话就没难度了
  • 若是必须要在原字符串覆盖,需判断char数组是否为NULL,②char数组总长度是否足够被覆盖(要先数出字符串长度和空格数)
  • 若是必须要在原字符串覆盖,思路:设两个指针指向尾部,从后向前覆盖数组

bool ReplaceBlankSpace(char *cOrigin,int nOriSize){//在原字符串上做覆盖,nOriSize为数组总长度if(cOrigin!=NULL && nOriSize>0){//记录字符串长度(不包括'\0')和空格数int nStrNum=0,nSpaceNum=0;while(cOrigin[nStrNum]!='\0'){if(cOrigin[nStrNum]==' ')++nSpaceNum;++nStrNum;}//原空间不足,必须算上'\0',if(nOriSize < (nStrNum+1+2*nSpaceNum)) return false;int nEndPoint=nStrNum+2*nSpaceNum; //从'\0'开始for(int nStartPoint=nStrNum;nStartPoint>=0;--nStartPoint){//从'\0'开始if(cOrigin[nStartPoint]==' '){cOrigin[nEndPoint--]='0';cOrigin[nEndPoint--]='2';cOrigin[nEndPoint--]='%';}elsecOrigin[nEndPoint--]=cOrigin[nStartPoint];}return true;}return false;}//创建新的字符串bool ReplaceBlankSpace(string &stOrigin,string &stUrl){if(stOrigin.empty())return false;stUrl.clear(); //清空stUrlfor(unsigned int i=0;i<stOrigin.size();++i){if(stOrigin[i]==' ') //注意不要写成" "{stUrl.push_back('%');stUrl.push_back('2');stUrl.push_back('0');}elsestUrl.push_back(stOrigin[i]);}return true;}int main(){string stOrigin("We are happy."),stUrl;if(ReplaceBlankSpace(stOrigin,stUrl))cout<<"空格替换成功:"<<stUrl<<endl;elsecout<<"替换失败……"<<endl;const int size=18;//char数组在字符串末尾会用'\0'填满char cOrigin[size]="We are happy.";if(ReplaceBlankSpace(cOrigin,size))cout<<"空格替换成功:"<<cOrigin<<endl;elsecout<<"替换失败……"<<endl;}
测试用例:
  • 输入字符串包含空格(一个空格位于最前、中间、最后,多个空格连续
  • 输入字符串不包含空格
  • 特殊输入测试(字符串是NULL指针、是空字符串、只有一个空格、只有连续多个空格、char数组总长度不足)
举一反三:
    有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的
2.常量字符串和字符串数组(P42)
注意点如下:
  • str1和str2是两个【字符串数组】,分配两个长度为12个字节的空间,并把"hello world"分别复制到数组中。所以两数组初始地址不同 str1≠str2
  • str3和str4是两个指针,无须分配内存以存储字符串的内容,只需要把它们指向"hello world"在内存中的地址。常量字符串在内存中【只有一个拷贝】str3==str4
int main(){    char str1[]="hello world";    char str2[]="hello world";    char *str3="hello world";    char *str4="hello world"; if(str1 == str2)        cout<<"str1和str2相同!"<<endl; else        cout<<"str1和str2不同……"<<endl; 【√】 if(str3 == str4)        cout<<"str3和str4相同!"<<endl; 【√】 else        cout<<"str3和str4不同……"<<endl;}




0 0
原创粉丝点击