当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

请实现一个函数,将一个字符串中的每个空格替换成 %20。例如,当字符串为 We Are Happy,则经过替换之后的字符串为 We%20Are%20Happy

解法

解法一

创建 StringBuilder,遍历原字符串,遇到非空格,直接 append 到 StringBuilder 中,遇到空格则将 %20 append 到 StringBuilder 中。

  1. /**
  2. * @author bingo
  3. * @since 2018/10/27
  4. */
  5. public class Solution {
  6. /**
  7. * 将字符串中的所有空格替换为%20
  8. * @param str 字符串
  9. * @return 替换后的字符串
  10. */
  11. public String replaceSpace(StringBuffer str) {
  12. if (str == null || str.length() == 0) {
  13. return str.toString();
  14. }
  15. StringBuilder sb = new StringBuilder();
  16. int len = str.length();
  17. for (int i = 0; i < len; ++i) {
  18. char ch = str.charAt(i);
  19. sb.append(ch == ' ' ? "%20" : ch);
  20. }
  21. return sb.toString();
  22. }
  23. }

解法二【推荐】

先遍历原字符串,遇到空格,则在原字符串末尾 append 任意两个字符,如两个空格。

用指针 p 指向原字符串末尾,q 指向现字符串末尾,p, q 从后往前遍历,当 p 遇到空格,q 位置依次要 append ‘02%’,若不是空格,直接 append p 指向的字符。

思路扩展:
在合并两个数组(包括字符串)时,如果从前往后复制每个数字(或字符)需要重复移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。

  1. /**
  2. * @author bingo
  3. * @since 2018/10/27
  4. */
  5. public class Solution {
  6. /**
  7. * 将字符串中的所有空格替换为%20
  8. * @param str 字符串
  9. * @return 替换后的字符串
  10. */
  11. public String replaceSpace(StringBuffer str) {
  12. if (str == null || str.length() == 0) {
  13. return str.toString();
  14. }
  15. int len = str.length();
  16. for (int i = 0; i < len; ++i) {
  17. if (str.charAt(i) == ' ') {
  18. // append 两个空格
  19. str.append(" ");
  20. }
  21. }
  22. // p 指向原字符串末尾
  23. int p = len - 1;
  24. // q 指向现字符串末尾
  25. int q = str.length() - 1;
  26. while (p >= 0) {
  27. char ch = str.charAt(p--);
  28. if (ch == ' ') {
  29. str.setCharAt(q--, '0');
  30. str.setCharAt(q--, '2');
  31. str.setCharAt(q--, '%');
  32. } else {
  33. str.setCharAt(q--, ch);
  34. }
  35. }
  36. return str.toString();
  37. }
  38. }

测试用例

  1. 输入的字符串包含空格(空格位于字符串的最前面/最后面/中间;字符串有多个连续的空格);
  2. 输入的字符串中没有空格;
  3. 特殊输入测试(字符串是一个空指针;字符串是一个空字符串;字符串只有一个空格字符;字符串中有多个连续空格)。

该分类下的相关小册推荐: