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

相关文章
相关标签/搜索