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

栏目: JavaScript · 发布时间: 5年前

内容简介:看到这道题总觉得眼熟,做完之后恍然大悟,这不就是小学数学做的找规律将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

看到这道题总觉得眼熟,做完之后恍然大悟,这不就是小学数学做的找规律

一、题目

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题比较有意思就去做那个,结果陷入了“这道题好难啊放一放吧去工作一会儿——工作好累啊去刷到题缓一缓——这道题好难啊放一放吧去工作一会儿”的恶性循环,现在这道第六题其实是我心态爆炸之后拿来找自信的,近期工作上的活也终于步入尾声了,重整旗鼓。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Twenty Lectures on Algorithmic Game Theory

Twenty Lectures on Algorithmic Game Theory

Tim Roughgarden / Cambridge University Press / 2016-8-31 / USD 34.99

Computer science and economics have engaged in a lively interaction over the past fifteen years, resulting in the new field of algorithmic game theory. Many problems that are central to modern compute......一起来看看 《Twenty Lectures on Algorithmic Game Theory》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具