资讯专栏INFORMATION COLUMN

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

cheukyin / 1672人阅读

摘要:看到这道题总觉得眼熟,做完之后恍然大悟,这不就是小学数学做的找规律一题目字形变换将一个给定字符串根据给定的行数,以从上往下从左到右进行字形排列。一当然是因为最近实在太忙了捂脸,几乎周周谁遭得住。

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104252.html

相关文章

  • python LeetCode 6.Z变换

    摘要:将一个给定字符串根据给定的行数,以从上往下从左到右进行字形排列。请你实现这个将字符串进行指定行数变换的函数示例输入输出示例输入输出解释题解找出规律然后按行读取,不断的获取同行下一个元素在整个字符串上的位置。 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 LEETCODEISHIRING 行数为 3 时,排列如下: L C I R...

    lentrue 评论0 收藏0
  • LeetCode6.Z字形变换 JavaScript

    摘要:字形变换将一个给定字符串根据给定的行数,以从上往下从左到右进行字形排列。请你实现这个将字符串进行指定行数变换的函数示例输入输出示例输入输出解释答案参考 LeetCode6.Z字形变换 JavaScript 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 LEETCODEISHIRING 行数为 3 时,排列如下: L C I R E...

    tuniutech 评论0 收藏0
  • 6-9月技术文章汇总

    摘要:分布式的管理和当我在谈论架构时我在谈啥状态码详解无状态协议和请求支持哪些方法分层协议栈有哪些数据结构运用场景说说你常用的命令为什么要有包装类面向对象的特征是啥是啥有什么好处系统设计工程在线诊断系统设计与实现索引背后的数据结构及算法原理软技能 HTTP 【HTTP】分布式session的管理 【HTTP】Cookie和Session 【HTTP】当我在谈论RestFul架构时我在谈啥?...

    miya 评论0 收藏0
  • LeetCode 精选TOP面试题【51 ~ 100】

    摘要:有效三角形的个数双指针最暴力的方法应该是三重循环枚举三个数字。总结本题和三数之和很像,都是三个数加和为某一个值。所以我们可以使用归并排序来解决这个问题。注意因为归并排序需要递归,所以空间复杂度为 ...

    Clect 评论0 收藏0
  • leetcode 6 ZigZag Conversion

    摘要:要求我们在之字形重新排列这个字符串后,再按正常的从上到下,从左至右的顺序输出拼接好的字符串。因此对于每一个字符,我们判断它应该在哪一行,然后将它加到它所在行的字符序列的尾部。最后我们合并每一行,获得最后的结果。 题目详情 The string PAYPALISHIRING is written in a zigzag pattern on a given number of rows ...

    Dr_Noooo 评论0 收藏0

发表评论

0条评论

cheukyin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<