LeetCode演算法6:java Z 字形變換
阿新 • • 發佈:2018-12-23
題目:
將一個給定字串根據給定的行數,以從上往下、從左到右進行 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字型變換