LeetCode.6 Z 字形變換(zigzag-conversion)(JS)

看到這道題總以爲眼熟,作完以後恍然大悟,這不就是小學數學作的找規律

1、題目

Z 字形變換:數組

將一個給定字符串根據給定的行數,以從上往下、從左到右進行 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"

2、個人答案

       首先分析一下題目,輸出內容就是從新排列以後的各行相加,那麼問題變成按照題幹規律排列,序號爲n的字符在第幾行。
       在示例1中,LEETCODEISHIRING行數爲3時,各個字符分別在1232-1232-1232-1232行,很明顯應該存在某種規律,能夠把字符串分紅幾組,而後每組按照這種規律push到不一樣行中,而後各行相加得出目標字符串,思路理清,代碼以下函數

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
  const perGroup = numRows > 1 ? (numRows - 2) * 2 + 2 : 1
  const result = []
  let i
  for(i = 0; i < numRows; i++) {
    result[i] = []
  }
  for(i = 0; i < s.length; i++) {
    result[i % perGroup < numRows ? i % perGroup : numRows - (i % perGroup - numRows + 2)].push(s[i])
  }
  let resultStr = ''
  result.forEach(item => {
    item.forEach(str => {
      resultStr += str
    })
  })
  return resultStr
};

       最後各行的數組都算出來了,轉成字符串的操做想用的數組flat而後再join的,可是leetCode的編譯環境好像不支持flat,就只能含淚用這種循環的方法了,最後運行用時擊敗88.52%,內存消耗擊敗33.66%,可是我不知道怎麼下降內存消耗/捂臉code

3、優秀答案

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    var map = {};
    var j = 0;
    if (numRows <= 1) {
        return s;
    }
    var boo = true;
    for (var i = 0; i < s.length; i++) {
        if (!map[j]) {
            map[j] = '';
        }
        map[j] = map[j] + s[i];
        if (boo) {
            j++;
            if (j >= numRows) {
                j = j - 2;
                boo = false;
            }
        } else {
            j--;
            if (j < 0) {
                boo = true;
                j = j + 2;
            }
        }
        
    }
    s = '';
    Object.keys(map).forEach(i => {
        s = s + map[i];
    });
    return s;
    
};

       這段代碼我並無仔細看,由於看他對j+2 - 2的這種操做還有最後相加的手段,都和我差很少,我複製下來再次提交,用時擊敗91.90%,內存消耗擊敗49.13%。這是我和優秀答案最近的一次/滑稽,甚至我我的感受個人代碼的可閱讀性要比他的更好,代碼寫出來就是給別人看的嘛(開始瘋狂自我安慰)內存

4、路漫漫其修遠兮

       原本說一週1-2道題的,可是這道題距離上次都快兩個月了。一固然是由於最近實在太忙了/捂臉,幾乎週週997誰遭得住。還有就是原本預計寫的第4題沒思路,隨便瀏覽的過程當中感受第42題比較有意思就去作那個,結果陷入了「這道題好難啊放一放吧去工做一下子——工做好累啊去刷到題緩一緩——這道題好難啊放一放吧去工做一下子」的惡性循環,如今這道第六題實際上是我心態爆炸以後拿來找自信的,近期工做上的活也終於步入尾聲了,重整旗鼓。leetcode

相關文章
相關標籤/搜索