剑指Offer第二题:把空格变成%20

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

题目分析

将一个字符串的空格替换成%20(JAVA源生的replace就不谈了用一个函数搞定那这个题目就没有任何意义),如果我们从前面往后面替换,那么会造成巨大的移动开销,字符串越大开销就越明显,所有从前面往后面替换显然不合理。那么我们能不能从后面到前面替换呢,答案是肯定的,而且效率还比较高。

算法描述

  • 首先应该从前往后统计字符串中的空格个数
  • 然后根据空格个数来扩大字符串的长度,并且记录先前的字符串尾和新的字符串尾
  • 然后从后面向前逐渐替换,这样平均每个字符移动一次,效率很高

 

PS:我是使用的是StringBuffer而不是String,应该String的字符串赋值后不能更改,StringBuffer在赋值后可以更改,比较适合与字符串的修改,更多区别请看JAVA中String和StringBuffer的区别这篇博客

源代码

 1 public class Solution {
 2     public String replaceSpace(StringBuffer str) {
 3         int spaceNumber=0;
 4         int lenth=str.length();
 5         for(int i=0;i<lenth;i++) {
 6             if(str.charAt(i)==' ')
 7                 spaceNumber++;
 8         }
 9         int newLenth=lenth+2*spaceNumber;
10         int indexOld=lenth-1;
11         int indexNew=newLenth-1;
12         
13         str.setLength(newLenth);
14         
15         while(indexOld>=0&&indexOld<indexNew) {
16             if(str.charAt(indexOld)==' ') {
17                 str.setCharAt(indexNew--, '0');
18                 str.setCharAt(indexNew--, '2');
19                 str.setCharAt(indexNew--, '%');
20                 
21             }else {
22                 str.setCharAt(indexNew--, str.charAt(indexOld));
23             }
24             indexOld--;
25         }
26         return str.toString();
27         
28         
29     }
30 }

运行截图

 

ps:转载标明出处

 

posted @ 2018-09-01 17:24  轻抚丶两袖风尘  阅读(331)  评论(0编辑  收藏  举报