注 題目來源:力扣
將一個給定字串根據給定的行數,以從上往下、從左到右進行 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;
};