剑指offer之把字符串里面空格替换成百分之20[时间复杂度是O(n)]

举报
chenyu 发表于 2021/07/27 00:11:21 2021/07/27
【摘要】 1 问题 把字符串里面空格替换成20% 要求:时间复杂度是O(n)             2 思路 比如我们字符串ab cd ef,我们先计算出新字符串需要的长度,我们分别搞2个指针指向老的和新的字符串的尾巴,然后老字符串从'\0'开始拷贝数据到新的字符串尾巴,同时两个指针同时左移,如果老的字符...

1 问题

把字符串里面空格替换成20%

要求:时间复杂度是O(n)

 

 

 

 

 

 

2 思路

比如我们字符串ab cd ef,我们先计算出新字符串需要的长度,我们分别搞2个指针指向老的和新的字符串的尾巴,然后老字符串从'\0'开始拷贝数据到新的字符串尾巴,同时两个指针同时左移,如果老的字符串遇到了空格,那么老的字符串指针往左边移动一格,然后新的字符串指针依然向左移动并且填充'0' 、'2'、 '%',直到老的字符串指针到最左边或者老的字符串指针和新的字符串指针相等就不循环了

 

 

 

 

 

3 代码实现


  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int insert(char *a, int len, char *replace, int replaceLen)
  5. {
  6. //先得到多少个空格
  7. char *p = a;
  8. //先得到多少个空格
  9. int count = 0;
  10. int oldLen = 0;
  11. while (*p != '\0')
  12. {
  13. if (*p == ' ')
  14. {
  15. ++count;
  16. }
  17. ++p;
  18. ++oldLen;
  19. }
  20. //计算新的字符串长度
  21. int newLen = oldLen + count * (replaceLen - 1);
  22. printf("oldLen is %d\n", oldLen);
  23. printf("newLen is %d\n", newLen);
  24. if (newLen > len)
  25. {
  26. printf("数组的长度不够\n");
  27. return -1;
  28. }
  29. //循环条件也就是需要移动的数组下标最左边
  30. while (oldLen >= 0) //或加上while(oldLen >=0 && oldLen < newLen)
  31. {
  32. //if (*(a + oldLen) != ' ')和下面的if等价
  33. if (a[oldLen] != ' ')
  34. {
  35. //这里用这个和下面的等价
  36. /**
  37. *(a + newLen) = *(a + oldLen);
  38. newLen--;
  39. oldLen--;
  40. **/
  41. a[newLen--] = a[oldLen--];
  42. }
  43. else
  44. {
  45. oldLen--;
  46. a[newLen--] = '0';
  47. a[newLen--] = '2';
  48. a[newLen--] = '%';
  49. }
  50. }
  51. return 0;
  52. }
  53. int main()
  54. {
  55. //这里给出数组的大小长度不能小于空格替换%20后
  56. //新的数组的长度,我们后面的函数需要做出处理
  57. char a[20] ="ab cd ef";
  58. int len = sizeof(a);
  59. int result = insert(a, len, "%20", 3);
  60. if (result != 0)
  61. {
  62. printf("insert fail\n");
  63. return -1;
  64. }
  65. printf("chars is %s\n", a);
  66. printf("区分strlen和sizeof\n");
  67. char c[] = "abc";
  68. char d[3] = "abc";
  69. char e[4] = "abc";
  70. char *p = "abc";
  71. printf("sizeof(c) is %d\n", sizeof(c));
  72. printf("sizeof(d) is %d\n", sizeof(d));
  73. printf("sizeof(e) is %d\n", sizeof(e));
  74. printf("sizeof(p) is %d\n", sizeof(p));
  75. printf("strlen(c) is %d\n", strlen(c));
  76. printf("strlen(d) is %d\n", strlen(d));
  77. printf("strlen(e) is %d\n", strlen(e));
  78. printf("strlen(p) is %d\n", strlen(p));
  79. return 0;
  80. }

 

 

 

 

 

4 运行结果


  
  1. oldLen is 8
  2. newLen is 12
  3. chars is ab%20cd%20ef
  4. 区分strlen和sizeof
  5. sizeof(c) is 4
  6. sizeof(d) is 3
  7. sizeof(e) is 4
  8. sizeof(p) is 8
  9. strlen(c) is 3
  10. strlen(d) is 3
  11. strlen(e) is 3
  12. strlen(p) is 3

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/87309083

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。