leetcode 链接:URL 化

题目

编写一种方法,将字符串中的空格全部替换为 %20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)

示例:

  1. 输入:"Mr John Smith ", 13
  2. 输出:"Mr%20John%20Smith"

解答 & 代码

使用双指针的方法:

  • 定义两个位置变量:
    • dest_end 指向字符串 S 的最后一位(包含尾部为保证足够空间设置的空格),即 dest_end = S.size() - 1
    • ori_end 指向空格被替换前有效字符的最后一位,即 ori_end = length - 1
  • ori_end 开始往前逆序遍历字符
    • 如果当前遍历到的字符不是空格,就将该字符赋值给 dest_end 对应的位置,dest_end 前移一步
    • 如果当前遍历到的字符是空格,就将 dest_end-2dest_end-1dest_end 三个位置分别赋值 %20dest_end 前移三步
  • 遍历结束(即 ori_end 减为 -1),此时不能直接返回 S,因为字符串 S 原本只保证了尾部有足够的空间存放新增字符,但不保证刚刚好,可能有富余,因此此时 dest_end 可能并不等于 0,那么 dest_end 及其之前位置的字符是多余的,要去掉,返回子串 S.substr(dest_end + 1)
    class Solution {
    public:
      string replaceSpaces(string S, int length) {
          int dest_end = S.size() - 1;
          int ori_end = length - 1;
          for(; ori_end >= 0; ori_end--)
          {
              if(S[ori_end] != ' ')
              {
                  S[dest_end] = S[ori_end];
                  dest_end--;
              }
              else
              {
                  S[dest_end - 2] = '%';
                  S[dest_end - 1] = '2';
                  S[dest_end] = '0';
                  dest_end -= 3;
              }
          }
          return S.substr(dest_end + 1);
      }
    };
    
    执行结果: ``` 执行结果:通过

执行用时:52 ms, 在所有 C++ 提交中击败了 29.83% 的用户 内存消耗:21.7 MB, 在所有 C++ 提交中击败了 69.10% 的用户 ```