翻手算法

看過編程珠璣的一定對裏面用來解決“字符循環左移”的翻手算法印象深刻,這個算法非常容易實現,效率還賊給力!

先說一下題意:如現在有一串字符:ABCDEFG,讓前兩個字符循環左移到整個個字符串的右邊,結果即:CDEFGAB


在具體講這種算法之前,先來看看線性代數裏的轉置。(AB)T等於什麼?等於BTAT。那麼(ATBTT等於什麼?等於(BTT(ATT,即BA。

啊哈!我們用三個步驟就可以完成這個字符串的循環左移了。對於字符串來講,轉置在這裏就是逆置。把原始字符串分成ab兩部分,a是前i個元素,b是後n-i個元素,首先對a求逆,得到a-1b,然後對b求逆得到a-1b-1,然後對整體求逆得到(a-1b-1-1=ba。

下面這張圖形象地說明了這種算法,這裏是將一個長度爲10的字符串循環左移5位。


代碼實現很簡單,java代碼如下:

public class TurnHand {
	
	public String process(String str,int m){
		char[] cs=str.toCharArray();
		turnHand(cs,0,m-1);
		turnHand(cs,m,cs.length-1);
		turnHand(cs,0,cs.length-1);
		return new String(cs);
	}
	public void turnHand(char[] cs,int i,int j){
		int length=j-i+1;
		for(int t=0;t<length/2;t++,i++){
			char temp=cs[i];
			cs[i]=cs[j-t];
			cs[j-t]=temp;
		}
	}
	public static void main(String[] args) {
		String str="ABCDEFG";
		String result=new TurnHand().process(str, 6);
		System.out.println(result);
	}
	
}


發佈了39 篇原創文章 · 獲贊 22 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章