题目
思路
遍历,使用新的字符串来接原字符串,如为空格,则加入%20,否则加入原字符串。
不过看了题解有另一种解法,由于空格转化为%20,设计到原字符存储空间的增加,因此先计算出需要增加的空间后。再使用双指针,从后往前遍历,这里画的动画比较好理解:
代码
public String replaceSpace(String s) {
// String temp = "%20";
StringBuilder s_new = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char temp = s.charAt(i);
if(temp - ' ' == 0){//判断当前字符是否为空格
s_new.append("%20");
}
else {
s_new.append(temp);
}
}
return s_new.toString();
}
public String replaceSpace_1(String s) {
// 使用双指针 不使用额外的空间
// 首先扩展原字符串的空间 一个空格就需要多2个位置
int count = 0;
// 用来存储扩展的空格
StringBuilder s_append = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char temp = s.charAt(i);
if(temp == ' '){//判断当前字符是否为空格 为空格则往s_append中加入两个空字符
s_append.append(" ");
}
}
// 左指针指向原字符串中最后一个字符
int l = s.length()-1;
// 将两个空间链接到一起
s += s_append.toString();
// 右指针指向新字符的最后一个位置
int r = s.length()-1;
// 将字符串改为char数组 方便使用下标对字符串内容进行修改
char[] s_array = s.toCharArray();
// 进入循环 退出条件为左指针遍历完左边所有字符
while (l >= 0){
// l指针所在位置为空格
if(s_array[l] == ' '){
s_array[r--] = '0';
s_array[r--] = '2';
s_array[r] = '%';
}
else {
s_array[r] = s_array[l];
}
r --;
l --;
}
return new String(s_array);
// return s_array.toString();
}
题目
思路
对字符串按空格进行分割,逆序遍历得到的字符串数组,将不为空格的(由于存在连续空格,按空格分割会保留一个空格)字符串添加到新字符串中,添加完一个字符串就加入一个空格,最后跳出循环后删掉最后一个空格即可。
代码
public String reverseWords(String s) {
String[] s_subs = s.split(" ");
StringBuilder s_new = new StringBuilder();
for (int i = s_subs.length - 1; i >= 0; i--) {
// System.out.println(s_subs[i]);
if(!s_subs[i].isEmpty()) {
System.out.println(s_subs[i]);
s_new.append(s_subs[i]);
s_new.append(" ");
}
}
// 删掉最后一个空格
s_new.deleteCharAt(s_new.length() -1);
return s_new.toString();
}