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