Note: 剑指offer的题可以在牛客网上做题验证思路的正确性
依赖StringBuffer的replace实现,时间复杂度O(n),空间复杂度较高
思路:因为StringBuffer本身是可变字符串序列,可以修改,实际上它的可变是牺牲空间换取的。替换可能导致超出其容量,char数组的复制和新建。
public String replaceSpace(StringBuffer str) {
// 判断是否为空
if(str == null){
return null;
}
String originalStr = str.toString();
String replacedStr = "%20";
int increaseLen = 2;
int spaceCount = 0;
int strLen = originalStr.length();
int index = 0;
while(index < spaceCount*increaseLen + strLen){
if(str.charAt(index) == ' '){
str.replace(index, index+1, replacedStr);
spaceCount++;
index += 3;
}else{
index++;
}
}
return str.toString();
}
如果进一步缩小空间复杂度
思路:先统计空格数,得到新字符串长度,再复制和替换,避免空间的浪费
public String replaceSpace(StringBuffer str) {
// 判断是否为空
if(str == null){
return null;
}
String originalStr = str.toString();
int increaseLen = 2;
int spaceCount = 0;
int strLen = originalStr.length();
// 统计空格数量
for(int i = 0; i < strLen; i++){
if(str.charAt(i) == ' '){
spaceCount++;
}
}
// 替换
int newStrLen = spaceCount*increaseLen + strLen;
char[] newCharSeq = new char[newStrLen];
spaceCount = 0;
for(int i = 0; i < newStrLen; ){
int oindex = i-spaceCount*2; //原位置
if(str.charAt(oindex) == ' '){
newCharSeq[i++] = '%';
newCharSeq[i++] = '2';
newCharSeq[i++] = '0';
spaceCount++;
}else{
newCharSeq[i] = str.charAt(oindex);
i++;
}
}
return new String(newCharSeq);
}