题目
https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/
思路
一开始自然想到的是直接讲String转换成char数组,然后用ascii码值把空格换成%20.
但很显然,%20不是char类型,会发现String是无法存到字符数组里面的。
此时,说明我们需要新建一个数组来存储。但这个数组要保证最坏的情况,就是数组里面元素基本都是空格。建立字符数组地长度为 s 的长度的 3 倍,这样可保证字符数组可以容纳所有替换后的字符。
public String replaceSpace(String s) {
int length = s.length();
char[] array = new char[length * 3];
//size是新数组的辅助指针帮助遍历
int size = 0;
//i是String转成char数组的辅助指针
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
if (c == ' ') {
array[size++] = '%';
array[size++] = '2';
array[size++] = '0';
} else {
array[size++] = c;
}
}
String newStr = new String(array, 0, size);
return newStr;
}
当然也可以采用更简单的StringBuilder
用到的方法:
- StringBuilder append(boolean b)
将boolean 参数的字符串表示形式追加到序列中。 - char charAt(int index)
返回char指定索引处的此序列中的值。 - String toString()
返回表示此序列中数据的字符串
public String replaceSpace(String s) {
//先把String转化成char数组
char[] c = s.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
//空格:32
for (char i:c) {
if (i==' '){ stringBuilder.append("%20");}
else { stringBuilder.append(i);}
}
return stringBuilder.toString();
}
但很显然,我们还有不需要建一个新的数组的方法
public String replaceSpace(String s) {
if(s == null || s.length() == 0){
return s;
}
//扩充空间,空格数量2倍
StringBuilder str = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == ' '){
str.append(" ");
}
}
//若是没有空格直接返回
if(str.length() == 0){
return s;
}
//有空格情况 定义两个指针
int left = s.length() - 1;//左指针:指向原始字符串最后一个位置
s += str.toString();
int right = s.length()-1;//右指针:指向扩展字符串的最后一个位置
char[] chars = s.toCharArray();
while(left>=0){
if(chars[left] == ' '){
chars[right--] = '0';
chars[right--] = '2';
chars[right] = '%';
}else{
chars[right] = chars[left];
}
left--;
right--;
}
return new String(chars);
}