1. 程式人生 > >Q6:ZigZag Conversion

Q6:ZigZag Conversion

etc leg 計數 post https rgs and bili href

6. ZigZag Conversion

官方的鏈接:6. ZigZag Conversion

Description :

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P   A   H   N
A P L S I I G
Y   I   R

And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

1 string convert(string text, int nRows);

convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".

問題描述

Z型轉換輸出轉換後的字符串

思路

方法一、參考官網
這也是比較容易想出來的,建立numRows個字符串,然後遍歷原字符串,對數組正數和倒數,逐個把字符按照規則添加到這些字符串數組中,最後合並。

方法二、不建立數組,直接根據規則一行一行拼接字符串。
1、Z型走法,一組總共是n = numRows + numRows - 2,即n個字符
2、從第0行開始計數,記為第row行,第0行和最後一行numRows-1的規則比較好確認:n * j + row即為第row所有的字符,j從0開始,直到n * j + row臨界,row行共有j個字符
3、其他行的字符,除了上面的記錄字符,在不會越界的情況下,還會多一個連接的字符,這個字符的下標可以這樣計算:(j + 1) * n - row,其實(j + 1) * n是下一組的開頭,減去當前的行數row,即可得到下一個字符,比如上面的例子,row=1,j=0,下一組的字符是A(第一行的第2個字符)(如下圖),計算出來的下標3,即P(第2行第2個字符)(如下圖),合並。

技術分享圖片

[github-here]

 1 public class Q6_ZigZagConversion {
 2     public String convert(String s, int numRows) {
 3         if (numRows == 1) {
 4             return s;
 5         }
 6         int n = numRows + numRows - 2, len = s.length();
 7         StringBuilder result = new StringBuilder();
 8         for
(int row = 0; row < numRows; row++) { 9 int j = 0, headIndex = j * n + row, tailIndex = (j + 1) * n - row; 10 while (headIndex < len) { 11 result.append(s.charAt(headIndex)); 12 j++; 13 headIndex = j * n + row; 14 if (row != 0 && row != numRows - 1 && tailIndex < len) { 15 result.append(s.charAt(tailIndex)); 16 tailIndex = (j + 1) * n - row; 17 } 18 } 19 } 20 return result.toString(); 21 } 22 23 public static void main(String[] args) { 24 Q6_ZigZagConversion s = new Q6_ZigZagConversion(); 25 System.out.println(s.convert("PAYPALISHIRING", 3)); 26 } 27 }

Q6:ZigZag Conversion