leetcode 链接:URL 化
题目
编写一种方法,将字符串中的空格全部替换为 %20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
示例:
输入:"Mr John Smith ", 13输出:"Mr%20John%20Smith"
解答 & 代码
使用双指针的方法:
- 定义两个位置变量:
dest_end指向字符串 S 的最后一位(包含尾部为保证足够空间设置的空格),即dest_end = S.size() - 1ori_end指向空格被替换前有效字符的最后一位,即ori_end = length - 1
 - 从 
ori_end开始往前逆序遍历字符- 如果当前遍历到的字符不是空格,就将该字符赋值给 
dest_end对应的位置,dest_end前移一步 - 如果当前遍历到的字符是空格,就将 
dest_end-2、dest_end-1、dest_end三个位置分别赋值%、2、0,dest_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% 的用户 ```
