1. 程式人生 > >【我的演算法日記】請實現一個函式,把字串中的每個空格替換成“%20”。例如輸入“We are happy.”,則輸出“We%20are%20happy.”。

【我的演算法日記】請實現一個函式,把字串中的每個空格替換成“%20”。例如輸入“We are happy.”,則輸出“We%20are%20happy.”。

請實現一個函式,把字串中的每個空格替換成“%20”。例如輸入“We are happy.”,則輸出“We%20are%20happy.”。在劍指offer中有這樣一道題目,我已經既不清楚了,我記得該題好像不準使用輔助空間,需要在遠字串上進行操作,如果在java中,直接用replaceAll方法就可以完成,但為了練習一些基本的演算法,我決定利用java,按自己的理解,寫下實現過程。第一篇練習演算法的博文,本身演算法就很差,大家多多包含。

首先分析該問題,

假設1:我們拋開時間複雜度和空間複雜度框框,你能想到什麼辦法。第一種,首先獲得源字串的總長度,然後獲得字串中空格的數目,空格的ASCII為32。因為沒出現一個空格,就換多增加三個字元,所以替換後的長度為:源字串長度+空格數目*2。獲取空格數目後,增加一個輔助陣列,長度為新字串的長度(空格變為%20),依次掃描源字串,把源字串中的字元依次新增到新字串的末尾,指標依次掃描新字串下標,為什麼我這樣寫,從前往後加滿腦子沒轉過來,只有這種辦法了。<**>,遇到空格則做特殊處理。依次往下,當掃描完所有源字元陣列的時候,你可以用java的reverse方法進行逆置,也就是反轉,獲得新字串。但我沒這樣做,再一次掃描新字串長度的1/2,新字串的首尾進行交換,得到新字串,總的來說時間複雜度為:源字串掃描次數+新字串長度的*1/2=0*(n);估計要被噴。輔助空間為源字串長度+空格數目*2的字元陣列。

假設2:獲取空格數目,再元字串上新增加空間,設立兩個指標,一個指向源字串第一個元素,一個指向元字串的末尾,依次掃描字串,遇到空格則末指標進行移動,兵替換空格,直到源指標與末指標相等,則完成替換。(沒這樣寫)。

程式碼寫的稀里嘩啦:

package com.lb.test;
import java.util.Scanner;
public class ReplaceSpace {
	public static void main(String[] args) {
		String str = "";
		int newIndex = 0;
		Scanner in = new Scanner(System.in);
		str = in.nextLine();
		/**
		 * 首先遍歷整個字串,找出字串中總共包含的空格數量,新增一個輔助陣列
		 */
		char []strArray = str.toCharArray();
		int oldLength = strArray.length;
		char []newArray = null ;
		int countSpace = 0;//空格數目
		for(char i:strArray){
			if((int)i==32){
				++countSpace;
			}
		}
		newArray = new char [2*countSpace+oldLength];//沒發現一個空格,新陣列的長度就要加2
		newIndex = newArray.length-1;
		for(int i = 0;i<oldLength;i++){
			if((int)strArray[i]==32){
				newArray[newIndex]='%';
				newArray[newIndex-1]='2';
				newArray[newIndex-2]='0';
				newIndex-=3;
			}else{
				newArray[newIndex] = strArray[i];
				newIndex-=1;
			}
		}
		System.out.println("轉換前的反字串為:");
		for(char i:newArray){
			System.out.print(i);
		}
		System.out.println("\n");
		/**
		 * 將字元陣列反轉,java中直接利用reverse,但為了練習演算法,
		 */
		int middle = newArray.length/2;
		for(int i=0;i<middle;++i){
			char temp;
			temp = newArray[i];
			newArray[i] = newArray[newArray.length-i-1];
			newArray[newArray.length-i-1] = temp;
		}
		System.out.println("替換後的字串為:");
		for(char i:newArray){
			System.out.print(i);
		}
	}
}