剑指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] != '')
  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. }

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




原文地址:https://www.cnblogs.com/zhuzhenfeng/p/4643448.html