leetcode 链接:URL 化
题目
编写一种方法,将字符串中的空格全部替换为 %20
。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
示例:
输入:"Mr John Smith ", 13
输出:"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-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% 的用户 ```