剑指Offer_编程题_替换空格

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 
 
 
链接: https://www.nowcoder.com/questionTerminal/4060ac7e3e404ad1a894ef3e17650423?answerType=1&f=discussion
来源:牛客网

思路:

  1. 解法一:用Java自带的函数str.toString().replace(" ","%20")。
  2. 解法二:在当前字符串上进行替换。
    1. 先计算替换后的字符串需要多大的空间,并对原字符串空间进行扩容;
    2. 从后往前替换字符串的话,每个字符串只需要移动一次;
    3. 如果从前往后,每个字符串需要多次移动,效率较低。
  3. 解法三:开辟一个新的字符串。

  4.解法四(我自己补充的):可以从前向后查找,如果看到空格,就把空格后面的字符串都向后移动3个长度。(认为此方式有问题的可以下面评论指正)

代码:

public class Test {
public static void main(String[] args) {
System.out.println( new Solution().replaceSpace(new StringBuffer("We Are Happy")));;
System.out.println( new Solution().replaceSpace2(new StringBuffer("We Are Happy")));;
}
}

  • 这是解题思路二的方式实现

首先遍历原字符串,找出字符串的长度以及其中的空格数量, 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。 设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。 如果point1指向内容不为空格,那么将内容赋值给point2指向的位置, 如果point1指向为空格,那么从point2开始赋值“02%” 直到point1==point2时表明字符串中的所有空格都已经替换完毕。



class Solution {
//
// 链接:https://www.nowcoder.com/questionTerminal/4060ac7e3e404ad1a894ef3e17650423?answerType=1&f=discussion
// 来源:牛客网

public String replaceSpace(StringBuffer str) {
int num=0;
int spacenum = 0;
for(int i = 0; i < str.length(); i++){
num++;
if(str.charAt(i) == ' '){
spacenum++;
}
}
int oldLength = str.length();
int oldIndex = oldLength - 1;
int newLength = oldLength + spacenum*2;
str.setLength(newLength);
int newIndex = newLength - 1;
for(; oldIndex >= 0 && oldLength < newLength; oldIndex--){
num++;
if(str.charAt(oldIndex) == ' '){
str.setCharAt(newIndex--, '0');
str.setCharAt(newIndex--, '2');
str.setCharAt(newIndex--, '%');
}else{
str.setCharAt(newIndex--, str.charAt(oldIndex));
}
}
System.out.println("次数 "+num);
return str.toString();
}


. // 解法四(我自己补充的):可以从前向后查找,如果看到空格,就把空格后面的字符串都向后移动3个长度。(认为此方式有问题的可以下面评论指正)


public String replaceSpace2(StringBuffer str) {
int num=0;
int has=0;
for (int i = 0; i < str.length()-has; i++) {
if(str.charAt(i) == ' '){
// 有空格,说明后面三个不用循环了
has=3;
int len= str.length();
int newl=len+3;
str.setLength(newl);
for (int j = newl; j >i+3 ; j--) {
str.setCharAt(j-1, str.charAt(len--));
num++;
}
str.setCharAt(i++, '%');
str.setCharAt(i++, '2');
str.setCharAt(i++, '0');

}else {
num++;
}

}
System.out.println("次数 "+num);
return str.toString();
}

}

结果:


上面两种方法都是循环24次

次数 24
We%20Are%20Happy
次数 24
We%20Are%20Happy


参考:https://blog.csdn.net/cpongo1/article/details/88536263

猜你喜欢

转载自www.cnblogs.com/liran123/p/12634828.html
今日推荐