剑指 Offer 05. 替换空格
看到这一题,首先最想想到的就是遍历插入了,最笨最实用。但是必须要考虑字符串当插入时他的长度是变化的,我们要注意他的临界条件。当然,不如创建一个字符数组,重新存储元素,当遇到空格就接下来写入%20,否则就是写入原来元素。
class Solution {
public String replaceSpace(String s) {
int length = s.length();
char[] array = new char[length * 3];
int size = 0;
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 str = new String(array, 0, size);
return str;
}
}
可是这个方法确实麻烦,不仅仅是字符串和字符数组来回转换,数据的存储也相当麻烦。不如直接用java中的StringBuilder来进行这一系列操作。
class Solution {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
char[] nums = s.toCharArray();
for(char c: nums)
{
if(c==' '){
sb.append("%20");
}
else{
sb.append(c);
}
}
return sb.toString();
}
}
当然,java中也有最简单的replace方法
class Solution {
public String replaceSpace(String s) {
return s.replace(" ", "%20");
}
}
这个方法也只是取巧,并不能代表自己思考了。还有一个方法,就是先计算出空格的个数,然后修改字符串长度,再找到空格进行替换。
class Solution {
public:
string replaceSpace(string s) {
int count = 0, len = s.size();
// 统计空格数量
for (char c : s) {
if (c == ' ') count++;
}
// 修改 s 长度
s.resize(len + 2 * count);
// 倒序遍历修改
for(int i = len - 1, j = s.size() - 1; i < j; i--, j--) {
if (s[i] != ' ')
s[j] = s[i];
else {
s[j - 2] = '%';
s[j - 1] = '2';
s[j] = '0';
j -= 2;
}
}
return s;
}
};
这几种方法也都是在自己能理解下去码的,字符串这一节就结束了,这节内容,感觉对于字符数组,字符串之间的变化还是有点迷糊,然后编程的思想还是没有养成,总是笨笨的暴力遍历,还有String类的各种方法也不太熟练,还是要去多刷题。