LeetCode.6 Z 字形变更(zigzag-conversion)(JS)

看到这道题总觉得眼熟,做完以后豁然开朗,这不就是小学数学做的找规律

一、题目

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%,然则我不知道怎样下降内存斲丧/捂脸

三、优异答案

/**
 * @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题比较有意思就去做谁人,效果陷入了“这道题好难啊放一放吧去事情一会儿——事情好累啊去刷到题缓一缓——这道题好难啊放一放吧去事情一会儿”的恶性轮回,如今这道第六题实际上是我心态爆炸以后拿来找自信的,近期事情上的活也终究步入尾声了,另起炉灶。

    原文作者:cvSoldier
    原文地址: https://segmentfault.com/a/1190000019332626
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞