1. 程式人生 > >LeetCode演算法6:java Z 字形變換

LeetCode演算法6:java Z 字形變換

題目:
將一個給定字串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。

比如輸入字串為 “LEETCODEISHIRING” 行數為 3 時,排列如下:

L C I R
E T O E S I I G
E D H N

之後,你的輸出需要從左往右逐行讀取,產生出一個新的字串,比如:“LCIRETOESIIGEDHN”。

請你實現這個將字串進行指定行數變換的函式:
string convert(string s, int numRows);

示例 1:
輸入: s = “LEETCODEISHIRING”, numRows = 3
輸出: “LCIRETOESIIGEDHN”

示例 2:
輸入: s = “LEETCODEISHIRING”, numRows = 4
輸出: “LDREOEIIECIHNTSG”
解釋:
L D R
E O E I I
E C I H N
T S G

說明:
仍舊是一個技巧題,網上很多網友的答案是尋找資料之間的錯綜複雜的關係,通過公式對關係的模擬,在達到最終的結果。
理解起來非常複雜,由於該題並沒有演算法複雜度的要求,因此應該用最簡單易懂的方式達到演算法目的才是該題的最好答案。

思路說明:
其實類似矩陣的佈局方式,可以通過設定一個類似矩陣的儲存,來達到將每行資料儲存在一起。因為字元中間的空白字元並沒有要求記錄,這就簡化了很多記錄和運算。

注意點:
1、對於跳轉方向的思路;
2、對於邊界的處理,即行數為1時要滿足要求。這裡將行數為1直接作為原結果返回,沒有參與到演算法的運算。

程式碼:

package _01_50;

public class _06ZigZagConversion{
	
	public String convert(String s , int nums){
		
		if(nums<2) return s;
		
		String[] rows= new String[nums];

		for(int i=0 ;i< nums;i++){	
			rows[i]="";
			}
			//it is useful for the j=0
		int direction = -1;
		//for the rounding
		int count = nums-1;
		int row = 0;
		System.out.println(s.length());
		
		for(int j=0;j< s.length();j++){
			rows[row]=rows[row]+s.charAt(j);
			//make the direction to be plus for first time
			if(j%count == 0){
				direction = -direction;
				}
			row = row + direction;
			System.out.println(row);
			}
			
		String convertStr = "";
		for(int i = 0;i< nums;i++){
			convertStr = convertStr+rows[i];
			}
			return convertStr;
		}
	
	public static void main(String[] arg){
		
		_06ZigZagConversion ZigZagConversion = new _06ZigZagConversion();
		
		String input = "PAYPALISHIRING";
		int nums = 1;
		String output = ZigZagConversion.convert(input,nums);
		System.out.println(output);
		}
	}

參考:
Z字型變換