常见面试题系列1——原地消除字符串连续的空白字符
来源:互联网 发布:51单片机综合设计 编辑:程序博客网 时间:2024/05/21 15:50
前两天看到一个文章“白板编程浅谈——Why, What, How”里说“原地消除字符串的重复空白(例:"ab c d e" => "ab c d e")则是一道合格的题目,因为即便不使用库函数,合格的面试者也能够在 20 分钟内完成这道题目。” 就试着自己写了下这个功能的实现。View CodeView CodeView Code
思路:因为题目限制了是原地,而不能借助一个辅助临时数组。所以第一想法可能会想到,从前往后遍历,遇到连续空白就将后面的内容全部向前移动,这样的确可以很快的写出来,但是时间复杂度就比较大了(0(n^2))。所以就想到用两个游动指针来标记已经遍历到的当前位置pRight和删除空白后当前位置pLeft。
一、首先呢,我考虑写一个删除字符串中所有空格(当然特定其他字符也是一样的),就写了下面的代码:
1 //删除字符数组str中的所有某个特定字符del 2 char * delChar(char* str, char del = ' ') 3 { 4 //防止传入无效参数-空指针 5 if(str==0 || *str==0 || del==0) 6 return str; 7 char *pLeft=str, *pRight=str; 8 while(*pRight!=0 && *pRight!=del) 9 ++pRight;10 pLeft = pRight;//第一个要删的位置11 while(*pRight==del) //跳过要删除的元素12 ++pRight;13 //当前pRight指向第一个要向前移动的元素14 for(;*pRight!=0;++pRight) {15 //*pRight不需要删除则向前复制元素16 if(*pRight!=del) {17 *pLeft = *pRight;18 ++pLeft;19 }20 }21 *pLeft = 0;22 return str;23 }
也可以这样:
1 //删除字符数组str中的所有某个特定字符del 2 char * delChar2(char* str, char del = ' ') 3 { 4 //防止传入无效参数-空指针 5 if(str==0 || *str==0 || del==0) 6 return str; 7 char *pLeft=str, *pRight=str; 8 //一直遍历到字符串尾部 9 for(;*pRight!=0;++pRight) {10 //*pRight到达第一个不需要删除的元素11 if(*pRight!=del) {12 //不指向同一元素13 if(pLeft!=pRight)14 *pLeft = *pRight;15 ++pLeft;16 }17 }18 //最后一位置0,不执行这一步将会有多余的上次残留输出19 *pLeft = 0;20 return str;21 }
二、然后,删除连续特定字符总体来说和上面代码的框架差不多,也是用两个游动指针来指向已经遍历的位置pRight(跑的比较快,所以在右边)和删除连续字符后的当前位置pLeft(跑的比较慢),只不过是要多加一层判断,连续两个要删除的字符出现时才让pRight跑得比pLeft快。代码如下:
1 //删除字符数组str中的所有连续重复的某个特定字符del 2 char * delRepeatedChar(char* str, char del = ' ') 3 { 4 //防止传入无效参数-空指针 5 if(str==0 || *str==0 || del==0) 6 return str; 7 char *pLeft=str, *pRight=str; 8 while(*pRight!=0 && *pRight!=del) 9 ++pRight;10 pLeft = pRight;//第一个 所指元素是要删除的字符11 for(; *pRight!=0; ++pLeft, ++pRight) {12 //pRight所指元素是要删除的字符13 if(*pRight==del) {14 //下一个元素也是要删除的字符,则删除下一个字符15 if(*(pRight+1)==del){16 *pLeft++ = *pRight;17 //移动到当前需要向前复制的位置18 while(*pRight==del)19 ++pRight;20 //复制元素21 *pLeft = *pRight;22 continue;23 }24 }25 //复制元素26 *pLeft = *pRight;27 }28 //最后一位置0,否则尾部可能有上一次的残留字符29 *pLeft = 0;30 return str;31 }
至此,这个功能的代码算是写完了,来弄一个主函数,调用一下吧:
#include<stdio.h>char * delRepeatedChar(char* str, char del);int main(){ char str[128] = " a c b cccd f ghh jk lmnnn qr st "; char del = 'c'; printf("请输入一个源字符串:"); while(gets(str)) { //一定要用gets而不是scanf,因为可能包含空格 printf("请输入一个要删除的字符:"); del = getchar(); printf("<%s> 删除连续的字符'%c'后:\n",str,del); printf("<%s>\n\n请输入一个源字符串:",delRepeatedChar(str,del)); getchar(); } return 0;}
0 0
- 常见面试题系列1——原地消除字符串连续的空白字符
- Google的一个面试题——数组原地置换
- Google的一个面试题——数组原地置换
- Google的一个面试题——数组原地置换
- 面试题之原地倒转字符串
- 常见的字符串面试题
- 字符串消除连续出现3次及以上的字符
- 字符串面试题系列之二:连续最长数字串
- PPTV面试题——括号消除
- 字符串面试题系列之六:在字符串中删除特定的字符
- 程序员面试题精选(50):字符串原地压缩
- [转] 程序员面试题精选(50):字符串原地压缩
- 算法练习系列—hiho1039 字符消除
- 算法练习系列—hiho1039 字符消除
- 【我解C语言面试题系列】011 删除指定字符串的相应字符
- 经典面试题--字符串系列(二)--找出第一个出现一次的字符
- 面试题——字符串中的字符是否唯一
- 面试题:查找两个字符串的连续子串
- 寻找第K大
- 关于执行executeUpdate()卡住、死循环
- 关于C++类模板无法解析的问题
- HDU 1754I Hate It (单点修改,区间查询
- 多线程思维导图
- 常见面试题系列1——原地消除字符串连续的空白字符
- 从机器学习谈起
- 基础知识之JQUERY-AJAX
- struct/class等内存字节对齐问题详解
- 如何掌握程序语言(王垠)
- 文章标题
- 关于C++虚函数表的那些事儿
- Bit-map法处理大数据问题
- #程序猿之路需要自己来铺垫#