1. 程式人生 > >劍指offer:替換空格

劍指offer:替換空格

ret urn onos ray 字符數組 amp 替換字符 rar log

題目描述

請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之後的字符串為We%20Are%20Happy。
題目鏈接

解題思路

  1. 替換字符串,是在原來的字符串上做替換,還是新開辟一個字符串做替換?需要與面試官確認
  2. 在當前字符串替換,怎麽替換才更有效率(不考慮java裏現有的replace方法)。
    從前往後替換,後面的字符要不斷往後移動,要多次移動,所以效率低下
    從後往前,先計算需要多少空間,然後從後往前移動,則每個字符只為移動一次,這樣效率更高一點
public class Solution {     public
String replaceSpace(StringBuffer str)
{ int spacenum = 0;//spacenum為計算空格數 for(int i=0;i<str.length();i++){ if(str.charAt(i)==‘ ‘) spacenum++; } int indexold = str.length()-1; //indexold為為替換前的str下標 int newlength = str.length() + spacenum*2
;//計算空格轉換成%20之後的str長度 int indexnew = newlength-1;//indexold為為把空格替換為%20後的str下標 str.setLength(newlength);//使str的長度擴大到轉換成%20之後的長度,防止下標越界 for(;indexold>=0 && indexold<newlength;--indexold){ if(str.charAt(indexold) == ‘ ‘){ // str.setCharAt(indexnew--, ‘0‘
); str.setCharAt(indexnew--, ‘2‘); str.setCharAt(indexnew--, ‘%‘); }else{ str.setCharAt(indexnew--, str.charAt(indexold)); } } return str.toString(); } }

註:這題原書上的輸入是字符串String,並且保證輸入字符串後面有足夠多的空余內存,如果是那樣的話,我們就不需要str.setLength(newlength)設置長度了。

  1. 新開辟一個字符串做替換(我這裏是用字符數組代替字符串,更易操作)
public class Solution {     public String replaceSpace(StringBuffer str) {         String tmp = str.toString();         char[] strChar = tmp.toCharArray();          int spaceNum = 0;         for(int i=0; i<strChar.length; i++){             if (strChar[i] == ‘ ‘)                 spaceNum ++;         }         int originLength = strChar.length - 1;         int finalLength = originLength + spaceNum*2;         char[] ret = new char[finalLength + 1];         for (int i = 0; i < strChar.length; i++) {              ret[i] = strChar[i];          }         while(originLength>=0 && finalLength>originLength)         {             if (strChar[originLength] == ‘ ‘){                 ret[finalLength--] = ‘0‘;                 ret[finalLength--] = ‘2‘;                 ret[finalLength--] = ‘%‘;             }             else{                 ret[finalLength--] = strChar[originLength];             }             originLength--;         }         return new String(ret);     } } 

舉一反三

在合並兩個數組(包括字符串)時,如果從前往後復制每個數字(或字符)則需要重復移動數字(或字符)多次,那麽我們可以考慮從後往前復制,這樣就能減少移動的次數,從而提高效率

劍指offer:替換空格