剑指offer-question5-替换空格

题目:

  请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“we are happy.”则输出“we%20are%20happy.”。

 

常规方法:

 把字符串转为字符数组,从头往后遍历数组,遇到空格,则把空格后面的所有元素往后移动两个位置直到遍历到字符串的尾部

时间复杂度o(n2

 1 package question5;
 2 
 3 import java.util.Arrays;
 4 
 5 public class SolutionRegular {
 6     
 7     public static void main(String[] args) {
 8         String str = "we are happy h h";
 9         char[] string = str.toCharArray();
10         char[] array = Arrays.copyOf(string, 25);
11         //array = str.toCharArray();
12         
13         int n = str.length();    //n用于储存字符串的长度
14         int m = n;        //m用于储存每次替换一个空格后的字符串的长度
15         //System.out.println("test n" + n); 
16         
17         for(int i = 0; i < m; i++) {
18             if(array[i] == ' ') {
19                 for(int j = m-1; j > i; j--) {
20                     array[j+2] = array[j];
21                 }
22                 m+=2;    //替换之后字符串的长度加2,方便下一次移动字符串元素
23                 array[i] = '%';
24                 array[i+1] = '2';
25                 array[i+2] = '0';
26             }
27         }
28         
29         for(int i = 0; i < array.length; i++) {
30             System.out.print(array[i]);
31         }
32     }
33 }

 

 运行结果:

 

优化方法:

先遍历一次字符串,统计字符串中的空格的个数,计算出替换之后字符串的总长度。

从字符串的后面开始复制和替换。

准备两个指针,一个指向原始字符串的末尾,一个指向替换之后字符串的末尾。

向前移动第一个指针,逐个把它指向的字符复制到第二个指针指向的位置,直到碰到第一个空格为止

碰到第一个空格后,往前移动第一个指针,在第二个指针前面插入字符串“%20”

 

 1 package question5;
 2 
 3 import java.util.Arrays;
 4 
 5 public class Solution {
 6     public static void main(String[] args) {
 7         String str = "we are happy.";
 8         int length = str.length();
 9         char[] string = str.toCharArray();
10         int count = 0;
11         for(int i = 0; i < length; i++) {
12             if(string[i] == ' ') {
13                 count++;
14             }
15         }
16         char[] array = Arrays.copyOf(string, length+count*2);
17         //System.out.println("test arraylength" + array.length);
18         //System.out.println("test stringlength" + length);
19         int p1 = array.length-1;    //p1指向扩充后数组的末尾
20         int p2 = length-1;            //p2指向原数组的末尾
21         for(int i = length-1; i > 1; i--) {
22             //System.out.println("test string i" + string[i]);
23             if(string[i] == ' ') {
24                 array[p1] = '0';
25                 array[p1-1] = '2';
26                 array[p1-2] = '%';
27                 p1-=3;
28                 p2-=1;
29             }
30             else {
31                 array[p1] = array[p2];
32                 p1-=1;
33                 p2-=1;
34             }    
35         }
36         for(int i = 0; i < array.length; i++) {
37             System.out.print(array[i]);
38         }
39     }
40 
41 }

运行结果省略

 

使用java的StringBuffer类自带的方法直接对字符串进行操作

 1 package question5;
 2 
 3 /**
 4  * 
 5  * @author crane
 6  *
 7  **使用StringBuffer类直接对字符串操作
 8  *
 9  */
10 
11 public class Solution1 {
12     public static void main(String[] args) {
13         StringBuffer str = new StringBuffer("we are happy.");
14         for(int i = 0; i < str.length(); i++) {
15             if(str.charAt(i) == ' ') {
16                 str.replace(i, i+1, "%20");
17             }
18         }
19         System.out.println(str);
20     }
21 }

运算结果省略

 

posted @ 2019-05-19 12:40  DIAO葫芦娃  阅读(173)  评论(0编辑  收藏  举报