JS程式|Z字形變換

2020-08-14 11:06:36

注 題目來源:力扣

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

比如輸入字串爲 "LEETCODEISHIRING" 行數爲 3 時,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N
之後,你的輸出需要從左往右逐行讀取,產生出一個新的字串,比如:"LCIRETOESIIGEDHN"。

請你實現這個將字串進行指定行數變換的函數
/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
   
};

解題思路:這個題目給人直觀的感受就是把數位分爲numRows個數組進行儲存,然後再把這幾個陣列一合併。(原諒我當時的想法,還想着每個字母存一個真的是傻),但是轉念一想,既然可以存了,那爲什麼不存成一個數組,每個元素儲存一個字串代表一行呢。

然後主要思路是這樣的,遍歷一次s字串,每取一個s[i] 將對應元素放入 arr[i] ,設定一個flag表示此時z字變換需要往上還是往下,每當flag=0或者flag=numRows-1的時候就變換flag。一圖勝千言,畫一個圖吧(excel畫的草圖)

囉嗦了這麼多,直接貼程式碼吧

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    //定義一個數組儲存每行的字串,num標記屬於哪行的字串,flag表示此時向上還是向下
    let arr=[],num=0,flag=false;
    if(numRows==1) return s;
    for(let c=0;c<numRows;c++){
        arr[c]="";
    }
    for(let c=0;c<s.length;c++){
        //到達最後一行
        if(num===numRows-1||num===0){
            flag=!flag;
        }
        arr[num]+=s[c];
        flag?++num:--num;
    }
    let ans='';
    for(let item of arr){
        ans+=item;
    }
    return ans;
};