Offer题4 替换空格&常量字符串和字符串数组
来源:互联网 发布:用js实现手机号 编辑:程序博客网 时间:2024/05/21 06:00
- 替换空格(P44)(面试题四)
- 常量字符串和字符串数组(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
- Offer题4 替换空格&常量字符串和字符串数组
- 剑指offer 4题 【字符串】替换空格
- 替换空格 合并数组字符串
- 字符串数组空格的替换
- 剑指Offer算法题之字符串替换字符--面试题4:替换空格
- 《剑指offer》刷题笔记(字符串):替换空格
- 剑指offer 2.3 数据结构4-替换字符串中的空格
- 剑指offer 面试题4—替换字符串中空格
- 剑指offer面试题4:替换字符串中的空格
- 剑指offer-面试4:替换空格(字符串操作)
- 剑指offer 面试题4—替换字符串中空格
- 【剑指offer】替换字符串中的空格_04
- 【剑指offer】替换字符串中的空格
- 剑指offer之替换字符串中的空格
- 《剑指offer》:[9]字符串中替换空格
- 剑指Offer之字符串空格替换问题
- 【剑指offer】字符串的空格替换
- 剑指offer——字符串空格替换
- UVaOJ_Problem401_Palindromes
- java动态代理
- 【杭电oj】2524 - 矩形A + B(找规律)
- Program received signal SIGSEGV, Segmentation faul;
- 观察者和策略
- Offer题4 替换空格&常量字符串和字符串数组
- kvc赋值
- Android 事件总线OTTO用法快速入门
- NAT(Network Address Translation)介绍
- Windows7如何显示文件后缀
- HDOJ 2026 首字母变大写
- Python @property
- windows客户端开发--使用tinyxml库解析xml文件
- android学习必备java基础知识——内部类