解析:(扩容+从后往前的双指针)
题目要求:请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
大体思路:直接创建一个StringBuilder,遍历并且遇到空格添加“%20”是可以做的。但是如果想直接使用一个数组的存储空间来完成怎么办?
因为每一个空格需要变为“%20",一个空格需要三个存储单位,空格自己有一个存储单位,所以需要在原来长度的基础上,每遇到一个空格就加上两个存储空间。
所以定义一个StringBuilder,遇到一个空格,就给它增加两个存储单位。
在讲StringBuiler使用toString()追加到原来的s后面,再使用toCharArray转为字符数组
left指向数组在原来字符串的末尾的位置,right指向数组追加后的字符串的末尾。
双指针的迭代规则如图所示:
right不断复制left的值,遇到空格,放入’0’, ‘2’, ‘%’.
所以为什么要从后向前插入,因为追加的空间在后面。
注意点:(数组填充类问题)
数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
代码:
class Solution {
public String replaceSpace(String s) {
if (s == null ||s.length() == 0) return "";
StringBuilder str = new StringBuilder();
for (char i : s.toCharArray()) {
if (i == ' ') str.append(" ");
}
if (str.length() == 0) return s;
int left = s.length() - 1;
s += str.toString();
int right = s.length() - 1;
char[] arr = s.toCharArray();
while (left >= 0) {
if (arr[left] == ' ') {
arr[right] = '0';
arr[right - 1] = '2';
arr[right - 2] = '%';
right -= 3;
left--;
} else {
arr[right] = arr[left];
right--;
left--;
}
}
return new String(arr);
}
}
索引:图片来自于代码随想录