1. 程式人生 > >[LeetCode] Z字型變換

[LeetCode] Z字型變換

不能 htm java nap pre 圖片 代碼實現 lis str

題目內容:

將字符串 "PAYPALISHIRING" 以Z字形排列成給定的行數:

P   A   H   N
A P L S I I G
Y   I   R
之後從左往右,逐行讀取字符:"PAHNAPLSIIGYIR"

實現一個將字符串進行指定行數變換的函數:

string convert(string s, int numRows);
示例 1:

輸入: s = "PAYPALISHIRING", numRows = 3
輸出: "PAHNAPLSIIGYIR"
示例 2:

輸入: s = "PAYPALISHIRING", numRows = 4
輸出: "PINALSIGYAHRPI"

  

思路:

找規律的題目,字符串各字母內容不管,找下標的規律,拿上面的第二個樣例為例子,下標排列是這樣子的

 /*
        * 0     6     12
        * 1   5 7  11 13
        * 2  4  8 10  14
        * 3     9     
        * */

  

可以看出,除去斜邊的,每一行都是一個等差數列,例如0,6,12

而斜邊的是豎排中的數加上某一個固定值,例如第二行就是1+4=5,7+4=11

然後綜合可以總結出規律,等差數列的差是numRows+numRows-2,即2*numRows-2,其實就是同一行相鄰數字中隔的數字

然後每一行中間要加的固定值,是前面等差數列的差依次-2,因為每向下一行兩個數間隔就少兩個數,例如第二行固定值4,第三行固定值就是4-2=2

之後就是用代碼實現了,相信也不難寫了

if(numRows>s.length()||numRows==1)
            return s;
        int length = s.length();
        int count = numRows*2-2;
        int next = 0;
        String result = "";
        for(int i = 0;i < numRows;i++){
            for(int j = i;j < length;){
                result = result + s.charAt(j);
                next = j + count - 2 * i;
                if(i!=0&&i!=numRows-1&&next<length){
                    //第一行和最後一行豎排中的數加上固定值和這個數字在等差數列的下一個值相等
                    //所以這兩行不管它
                    result = result + s.charAt(next);
                }
                j = j + count;
            }
        }
        return result;

  

這個還不是最優解,到時候看看還能不能優化

技術分享圖片

[LeetCode] Z字型變換