输入一个字符串,需要我们使用其他的字符替换空格字符。
例如:一个字符串:“We are happy.”,将其中的空格字符用%20替换。怎么做呢?
**第一种思路:**暴力法则,就是直接遍历字符串,遇到空格就将其替换为“%20”。
分析这种方法容易想到,几乎每个人都能想到,但是这种方法的不足就是每次遇到一个空格就需要替换为%20这三个字符,如果不移动后续的字符串,会使得后续的字符串被覆盖,因此,每替换一个空格,该空格后面的字符串都要向后移动,这样与靠后的字符串移动的次数就会越多,这样的时间复杂度就上升为:O(n^2)。
所示,这样做每次都需要移动字符串所以使得时间复杂度提升了,因此我们思考别的方法。
第二种思路我们每遇到一个空格替换为长度为3的%20的字符串,所以我们可以事先计算出来替换完后,最终字符串的长度,然后射这两个指针,一个指着原始字符串的末尾,一个指着新字符串的末尾,从后往前替换,没有遇到空格就复制字符串,遇到空格,替换为%20,这样所有的字符串都仅需复制一遍,时间复杂度仅仅为O(n)。
假设原始字符串的长度为length,那么替换完后,新字符串的长度为:length+num*2,(num为空格数目。)
思路如下图所示:
class Replace{/*定义一个类,通过调用类中的方法可以将带有空格的字符串替换为“%20”的效果。*/public String Exchange(String str) { // 替换字符串的方法int num = 0;char[] arr = str.toCharArray();if(str == null || str.length() < 0) {return null;}for(int i =0;i < arr.length;i++) {//查找字符串中的空格数目if(arr[i] == ' ') {num++;//每找到一个空格就使得num++}}int newStrLength = str.length() + num * 2; //计算新的字符串的长度char[] newStr = new char[newStrLength];//定义一个新的字符串int n = arr.length-1;int m = newStr.length - 1;while(n >=0 && m >= n) {if(arr[n] == ' ') {newStr[m--] = '0';newStr[m--] = '2';newStr[m--] = '%';}else {newStr[m--] = arr[n];}--n;}//System.out.println(newStr);//用于测试最终的结果。String s = new String(newStr); // return newStr.toString(); 不能这样直接返回,否则最终的结果就是一个[类型@哈希值],这是因为如果是一个对象进行toString()方法,就会调用object类里面的//toString()方法,所以返回的就是[类型@哈希值],因此,可以通过这样返回字符串,1、如上所示,定义一个字符串对象;2、String str.valueOf(newStr)。return s;}
}
public class ReplaceBlank {public static void main(String[] args) { System.out.println("请输入一个字符串:");Scanner sc = new Scanner(System.in);String str = sc.nextLine().toString();Replace re = new Replace();String result = re.Exchange(str);System.out.println("替换后的结果是:" + result);}
}
结果如下图所示:
第三种思路没什么难的,就是直接使用JAVA的方法库里面的函数,直接输出就行。如下图所示:
import java.util.Scanner;
class Solution{public String Replace(String str) {String arr = null;if(str == null) {return null;}else {arr = str.replaceAll(" ", "%20");//利用java的方法直接替换。}return arr;}
}
public class ReplaceBlank {public static void main(String[] args) {System.out.println("请输入一个字符串:");Scanner sc = new Scanner(System.in);String str = sc.nextLine().toString();Solution s = new Solution();String a = s.Replace(str);System.out.println("最终的结果是: " + a);}
}
最终的结果如下图所示:
以上只是本人的一点理解,希望各位有什么想法积极留言探讨。谢谢!