博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题三 替换空格
阅读量:4969 次
发布时间:2019-06-12

本文共 1557 字,大约阅读时间需要 5 分钟。

题目

  请实现一个函数,把字符串中的每个空格替换成" %20 "。( 假定字符串未使用空间足够且只允许在原字符串上做替换 )

  PS:括号内的说明未必会给出,这时候需要和考官进行沟通,了解他具体的需求。

差劲的思想

  1. 编写一个移位函数,每次调用可将字符串的未处理部分往后移两个位置。

  2. 遍历目标字符串,每当遇到空格则先调用1中函数一次,再将空格替换成%20,然后继续遍历。

分析

  O(n²)的复杂度,显然不会让自己以及面试官满意。

  如果能够在遍历的过程中,每次都将处理的字符移动到它最终的位置,那么复杂度就可降低到O(n)。对此,可以采用从后往前遍历的方法,设定两个指针,一个从最终生成字符串的最后一个位置向前遍历,一个从初始字符串的最后一个位置向前遍历。而最终生成字符串的最后一个位置是可以通过一次遍历而得出。

实现代码( 含测试 )

1 #include 
2 #include
3 4 using namespace std; 5 6 // 字符串长度 7 #define MAX 100 8 9 // 字符串处理函数10 bool convert(char array[]);11 12 int main()13 {14 char array[MAX];15 16 cout << "请输入待测试字符串:" << endl;17 gets(array);18 19 if (convert(array))20 cout << endl << "转换成功!处理后字符串:" << array << endl;21 else 22 cout << "处理异常!" << endl;23 24 return 0;25 }26 27 bool convert(char array[])28 {29 if (array == NULL) {30 return false;31 }32 33 // 判断待处理字符串的实际长度34 // 以及字符串中的空格个数35 int count = 0;36 int counts = 0;37 char *p = array;38 while (*p!='\0') {39 if (*p == ' ')40 counts++;41 p++;42 count++;43 }44 45 // 确定空间是否足够大46 if ((count + counts*2) >= MAX)47 return false;48 49 // 定义两个遍历指针50 char *p1 = p-1;51 char *p2 = p;52 53 // 找到结果字符串的最后位置54 p2 = p+2*counts;55 56 // 将结果字符串的末尾赋值为'\0'57 *p2 = '\0';58 p2--;59 60 // 两路指针一起遍历并作出处理61 for (int i=0; i

运行测试

小结

  1. 字符串处理函数提高效率的关键往往是一次将字符移动到它最终的位置

  2. 本题中两个指针同时遍历的思想值得思考

 

转载于:https://www.cnblogs.com/scut-fm/p/3590951.html

你可能感兴趣的文章
Linux c参数解析函数 getopt_long()函数
查看>>
第十二周项目一 教师兼干部类】 共建虚基类person
查看>>
Rest数据服务查询类-根据id查询
查看>>
java秒杀系列(1)- 秒杀方案总体思路
查看>>
JPA查询getOne()与findOne()的差异以及一些小问题
查看>>
我的Vscode配置
查看>>
Jmeter实现dubbo接口压测
查看>>
更改mac系统语言及其软件
查看>>
Binary compatibility 二进制兼容
查看>>
SQL-删除重复数据
查看>>
8.8.3 抽象类
查看>>
IOS网络请求框架AFNetworking和ASIHttpRequest对比
查看>>
中国顶级黑客,马云天价请不动
查看>>
2019 Multi-University Training Contest 4
查看>>
修改AD FS
查看>>
C函数篇(strcat函数)
查看>>
洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX
查看>>
苹果的AR赌注仍然有很多需要证明的
查看>>
spring mvc 的配置 及interceptor filter listener servlet 配置
查看>>
C# Path 有关于文件路径等问题类(转)
查看>>