剑指offer:替换空格

##题目:请实现一个函数,把字符串中的每个空格替换成%20。例如输入“We are happy.",则输出”We%20are%20happy."。

最容易想到的是,从头到尾扫描,每次碰到空格就替换。但是时间复杂度为o(n2)。

时间复杂度为o(n)的解法是:

首先遍历字符串,统计出字符串中空格的总数,然后计算出替换之后的字符串的总长度。然后准备2个指针,P1,P2,。P1,指向原串的末尾,P2指向新串的末尾。然后向前移动,逐个把P1指向的字符复制到P2指向的位置,遇到空格,就让P1向前移动,P2插入字符串%20,然后把P2向前移动3格。

  1. /*length 为字符数组string的总容量*/
  2. void ReplaceBlank(char string[], int length)
  3. {
  4. if(string == NULL && length <= 0)
  5. return;
  6. /*originalLength 为字符串string的实际长度*/
  7. int originalLength = 0;
  8. int numberOfBlank = 0;
  9. int i = 0;
  10. while(string[i] != ‘\0‘)
  11. {
  12. ++ originalLength;
  13. if(string[i] == ‘ ‘)
  14. ++ numberOfBlank;
  15. ++ i;
  16. }
  17. /*newLength 为把空格替换成‘%20‘之后的长度*/
  18. int newLength = originalLength + numberOfBlank * 2;
  19. if(newLength > length)
  20. return;
  21. int indexOfOriginal = originalLength;
  22. int indexOfNew = newLength;
  23. while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
  24. {
  25. if(string[indexOfOriginal] == ‘ ‘)
  26. {
  27. string[indexOfNew --] = ‘0‘;
  28. string[indexOfNew --] = ‘2‘;
  29. string[indexOfNew --] = ‘%‘;
  30. }
  31. else
  32. {
  33. string[indexOfNew --] = string[indexOfOriginal];
  34. }
  35. -- indexOfOriginal;
  36. }
  37. }

合并两个数组的时候,如果从前往后复制的话,需要移动数字或字符多次,因此可以考虑从后往前复制。

来自为知笔记(Wiz)

时间: 2024-08-03 08:11:27

剑指offer:替换空格的相关文章

[剑指OFFER] 替换空格

题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 分析: 个人理解,应该是对空间复杂度有要求,如果没有要求,下面code就OK class Solution { public: string replaceSpace(string str) { string rtn; for(int i = 0; i < str.size(); i++) { if(str[i] == ' ') r

剑指offer替换空格

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 class Solution { public:     string replaceSpace(string str) {         stack<int> Mystack;     int length=str.length();     in

剑指offer——替换字符串

总结:先计算出总共有多少空格,count++:然后从后往前遍历,每遇到一个空格,count--: 替换空格 参与人数:2119时间限制:1秒空间限制:32768K 通过比例:20.23% 最佳记录:0 ms|8552K(来自  牛客游客) 题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 完整代码: public class StringreplaceSpace { public

【剑指offer】空格替换

Question 设计一种方法,将一个字符串中的所有空格替换成 %20 .你可以假设该字符串有足够的空间来加入新的字符,且你得到的是"真实的"字符长度. Solution 1 需要额外的一个数组: class Solution { public: /** * @param string: An array of Char * @param length: The true length of the string * @return: The true length of new st

剑指offer—替换字符串中空格

题目: 实现一个函数,把字符串中的每个空格替换成"%20".加入输入"we are happy.",则输出"we%20are%20happy.". 时间复杂度为O(n^2) 基本思想:从前往后把字符串中的空格替换成%20. 假设字符串的长度为n,对每个空格字符,需要移动后面O(n)个字符,因此总的时间复杂度为O(n^2). 时间复杂度为O(n) 基本思想:先遍历找出空格总数,并计算出替换之后的字符串的总长度.然后从字符串的后面开始复制和替换. 所

剑指offer 替换字符串中的空格

void replaceSpace(char *str,int length) { if(str==NULL||length<=0) return; int originlen=0; int newlen=0; int space=0; while(str[originlen]!='\0') { if(str[originlen]==' ') space++; originlen++; } originlen++; newlen=originlen+2*space; if(originlen==

剑指Offer-2.替换空格(C++/Java)

题目: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 分析: 题意明确,就是将一个字符串中的每个空格替换成“%20”,可以新建一个空字符串,遍历原字符串,遇到空格就添加“%20”,否则就将字符添加进新串中. 不过这种方法需要额外的空间,我们可以在原字符串上进行操作. 如果从头开始遍历字符串,遇到空格将其替换成为“%20”,需要将后面的字符进行后移操作,时间复杂度很高. 所以我们可以先

剑指Offer02 替换空格

1 /************************************************************************* 2 > File Name: 02_Replace_Blank.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月24日 星期三 01时28分33秒 6 *************************************

剑指Offer 目录

剑指Offer01 杨氏数组寻值 剑指Offer02 替换空格 剑指Offer03 逆序输出链表&链表逆序

【剑指offer】第四题 替换空格

/** * 剑指offer 第4题 替换空格 * 特点:1.先扫描串中的空格数,计算好替换后的长度 * 2.使用双指针,从后面开始向前替换,避免从前开始每次替换后就要移动后面的所有的数据 * 测试用例:特殊:有多个空格 * 错误:数组长度不够,字符串为空 * */ package javaTrain; public class Offer4 { public static void main(String[] args) { String a = "Hello I am Daisy Dong!&