《劍指Offer》第二版之替換空格(三)

目錄

題目:
請實現一個函數,把字符串中的每個空格替換成”%20“,例如,輸入“We are happy.”,則輸出“We%20are%20happy.”。
思路:
我們可以先遍歷一次字符串,這樣就能統計出字符串中空格的總數,並可以由此計算出替換之後的字符串的總長度。每替換一個空格,長度增加2,因此替換以後字符串的長度等於原來的長度加上2乘以空格數目。
步驟:
1.我們從字符串的後面開始複製和替換。首先準備兩個指針:P1和P2。P1指向原始字符串的末尾,而P2指向替換之後的字符串的末尾。
2.接下來我們向前移動指針P1,逐個把它指向的字符複製到P2指向的位置,直到碰到第一個空格爲止。把P1向前移動1格,在P2之前插入字符串”%20“。由於”%20“的長度爲3,同時也要把P2向前移動3格。
3.我們接着向前複製,直到碰到第二個空格。和上一次一樣,我們再把P1向前移動1格,並把P2向前移動3格插入”%20“。此時P1和P2指向同一位置,表明所有的空格都已經替換完畢。
代碼:
package test;

public class ReplaceBlank {

	public static void main(String[] args) {
		System.out.println(replaceBlank(new StringBuilder("We are happy.")));
	}
	
	public static String replaceBlank(StringBuilder sb) {
		//1.如果輸入的字符串爲null,則直接返回
		if(sb == null)
			return null;
		
		//2.計算出空格數量
		int numberOfBlank = 0;
		for (int i = 0; i < sb.length(); i++) {
			if(sb.charAt(i) == ' ')
				++numberOfBlank;
		}
		
		//3.計算新字符串的長度
		int originalLength = sb.length();
		int newLength = originalLength + numberOfBlank * 2;
		int indexOfOriginal = originalLength - 1;
		int indexOfNew = newLength - 1;
		sb.setLength(newLength);
		
		//4.進行空格替換
		while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal) {
			if(sb.charAt(indexOfOriginal) == ' ') {
				sb.setCharAt(indexOfNew--, '0');
				sb.setCharAt(indexOfNew--, '2');
				sb.setCharAt(indexOfNew--, '%');
			} else {
				sb.setCharAt(indexOfNew--, sb.charAt(indexOfOriginal));
			}
			--indexOfOriginal;
		}
		
		return sb.toString();
	}
}

注:該算法的時間複雜度爲O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章