输入一个字符串,需要我们使用其他的字符替换空格字符。
例如:一个字符串:“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);
}
}
最终的结果如下图所示:
以上只是本人的一点理解,希望各位有什么想法积极留言探讨。谢谢!