算法复习,第一遍刷剑指Offer
那么多学技术的都可以成功,凭什么我不行?
1、题目
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
2、思路
思路1:
利用SpringBuilder,因为Spring是不可变的。从前往后遍历字符串,遇到空格就将后面所有的字符都向后移两格。这样会导致后面的字符串会被移动很多次,此思路时间复杂度是O(n2)。
思路2:
先计算出需要的总长度,然后从后往前进行复制和替换,则每个字符只需要复制一次即可。时间效率为O(n)。
3、实现代码
解法1(思路2)
public String replaceSpace(StringBuilder str) {
//如果str为null
if (str == null) {
return null;
}
int length = str.length();//源来字符串长度
int indexOfOringinal = length - 1;//原str最后下标的位置
for (int i = 0; i < str.length(); i++) {
//如果当前字符为空格
if (str.charAt(i) == ' ') {
length += 2;//length+2
}
}
str.setLength(length);
int indexOfNew = length - 1;//新str最后下标的位置
while (indexOfOringinal < indexOfNew) {
if (str.charAt(indexOfOringinal) != ' ') {
str.setCharAt(indexOfNew--, str.charAt(indexOfOringinal));
} else {
str.setCharAt(indexOfNew--, '0');
str.setCharAt(indexOfNew--, '2');
str.setCharAt(indexOfNew--, '%');
}
indexOfOringinal--;
}
return str.toString();
}
解法2
利用StringBuilder的append方法
/*利用StringBuilder的append方法,直接遍历原字符串,如果是空格则追加'%20'到新字符串,
如果不是空格,直接追加到新字符串末尾。
开辟了新空间,会增加空间复杂度。*/
public String replaceSpace2(StringBuilder str) {
if (str == null) return null;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
if (String.valueOf(str.charAt(i)).equals(" ")) {//String.valueOf()将字符转换成字符串
sb.append("%20");
} else {
sb.append(str.charAt(i));
}
}
return String.valueOf(sb);
}
解法3
/*直接使用replaceAll方法*/
public static String replaceSpace3(StringBuilder str) {
return str == null ? null : str.toString().replaceAll(" ", "%20");
}