输入一个字符串,需要我们使用其他的字符替换空格字符。

例如:一个字符串:“We are happy.”,将其中的空格字符用%20替换。怎么做呢?

**第一种思路:**暴力法则,就是直接遍历字符串,遇到空格就将其替换为“%20”。

分析这种方法容易想到,几乎每个人都能想到,但是这种方法的不足就是每次遇到一个空格就需要替换为%20这三个字符,如果不移动后续的字符串,会使得后续的字符串被覆盖,因此,每替换一个空格,该空格后面的字符串都要向后移动,这样与靠后的字符串移动的次数就会越多,这样的时间复杂度就上升为:O(n^2)。

android 字符串中有多个空格如何分割字符串 字符串中的空格_System


所示,这样做每次都需要移动字符串所以使得时间复杂度提升了,因此我们思考别的方法。

第二种思路我们每遇到一个空格替换为长度为3的%20的字符串,所以我们可以事先计算出来替换完后,最终字符串的长度,然后射这两个指针,一个指着原始字符串的末尾,一个指着新字符串的末尾,从后往前替换,没有遇到空格就复制字符串,遇到空格,替换为%20,这样所有的字符串都仅需复制一遍,时间复杂度仅仅为O(n)。

假设原始字符串的长度为length,那么替换完后,新字符串的长度为:length+num*2,(num为空格数目。)

思路如下图所示:

android 字符串中有多个空格如何分割字符串 字符串中的空格_字符串_02

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);
 }
}

结果如下图所示:

android 字符串中有多个空格如何分割字符串 字符串中的空格_时间复杂度_03


第三种思路没什么难的,就是直接使用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);
 }
}

最终的结果如下图所示:

android 字符串中有多个空格如何分割字符串 字符串中的空格_System_04


以上只是本人的一点理解,希望各位有什么想法积极留言探讨。谢谢!