看到這道題總以爲眼熟,作完以後恍然大悟,這不就是小學數學作的找規律
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"
首先分析一下題目,輸出內容就是從新排列以後的各行相加,那麼問題變成按照題幹規律排列,序號爲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
/** * @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%。這是我和優秀答案最近的一次/滑稽,甚至我我的感受個人代碼的可閱讀性要比他的更好,代碼寫出來就是給別人看的嘛(開始瘋狂自我安慰)內存
原本說一週1-2道題的,可是這道題距離上次都快兩個月了。一固然是由於最近實在太忙了/捂臉,幾乎週週997誰遭得住。還有就是原本預計寫的第4題沒思路,隨便瀏覽的過程當中感受第42題比較有意思就去作那個,結果陷入了「這道題好難啊放一放吧去工做一下子——工做好累啊去刷到題緩一緩——這道題好難啊放一放吧去工做一下子」的惡性循環,如今這道第六題實際上是我心態爆炸以後拿來找自信的,近期工做上的活也終於步入尾聲了,重整旗鼓。leetcode