劍指offer:替換空格
阿新 • • 發佈:2018-01-06
ret urn onos ray 字符數組 amp 替換字符 rar log
題目描述
請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之後的字符串為We%20Are%20Happy。
題目鏈接
解題思路
- 替換字符串,是在原來的字符串上做替換,還是新開辟一個字符串做替換?需要與面試官確認
- 在當前字符串替換,怎麽替換才更有效率(不考慮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)設置長度了。
- 新開辟一個字符串做替換(我這裏是用字符數組代替字符串,更易操作)
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:替換空格