0 题目来源
1 本题涉及到的知识点
字符串、双指针、substr
substr
- 功能为从原来的字符串中截取一部分字符串。
- string类型的一个方法
- 使用方式为:
**str.substr(begin,num);**
begin处填写开始的子串位置,num处填写截取子串的长度。如**str.substr(2,4);**
表示截取str的2~5位。2 题目描述
URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
提示:
- 字符串长度在 [0, 500000] 范围内。
3 输入与输出格式
无,力扣略了4 样例
示例 1:
输入:”Mr John Smith “, 13
输出:”Mr%20John%20Smith”
示例 2:
输入:” “, 5
输出:”%20%20%20%20%20”5 分析与代码
按照本题的题意,需要在原来字符串的基础上进行修改,因此我们可以采用从后向前遍历字符串的方法。
首先对字符串进行遍历,得出其中拥有的需要转化的空格数目。
然后使用两个指针,一个指向我们计算出的转化后的字符串的末尾,另一个指向未转化的字符串末尾。
之后用一个while循环对字符串进行转化,两个指针同步移动,如果遇到空格,则将接下来的3个位置转化为02%,以此类推,直到两个指针移到字符串的头。
在这个过程中,我那么可以判断两个指针是否相等,如果相等,则说明剩下的部分没有空格,不需要转化了,此时就需要推出循环,通过这种方式可以减小时间复杂度。
最后,要注意使用substr对返回的字符传进行控制,由于给定的字符串的空间最后可能还有剩余(空格),因此,我们需要去掉这些空格,使用substr取出给定字符串的子串,从而得到最终的答案。
代码:class Solution {
public:
string replaceSpaces(string S, int length) {
int SpaceNum = 0;
for (int i = 0; i < length; i++)
{
if (S[i] == ' ')
SpaceNum++;
}
int p1 = length - 1;//字母指针
int p2 = length + SpaceNum * 2 - 1;//字符串指针
while (p2 >= 0 && p1 >= 0)
{
if (S[p1] != ' ')
S[p2--] = S[p1];
else
{
S[p2--] = '0';
S[p2--] = '2';
S[p2--] = '%';
}
p1--;
if (p1 == p2)
break;
}
return S=S.substr(0,length + SpaceNum * 2);
}
};