Q:
题目链接:ZigZag Conversion
先看题目要求:
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
And then read line by line: “PAHNAPLSIIGYIR”
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.
分析
题目要求百度了一圈才看懂……其实就是要求要一个字符串按”Z”字形排列(请参考上面的图),然后将其按照第一行、第二行…的顺序重新排列,得到的结果就是最终的答案。具体有几行是入参决定的。
来看下思路,起初我试图寻找每行的字符串的下标的规律,结果找了半天只找到了第一行和最后一行的规律,而且感觉要写两个循环才能搞定,所以放弃了。后面转变思路,可否用一个数组来存储结果,数组的元素个数为函数的入参numRows,也就是行数,每个元素的值就是这一行字符串拼接后的结果。能想到这个数据结构感觉就成功了一半。接下来再引入一个指针,不断在第一行和最后一行之间波动(最小值为0,最大值为numRows-1),差不多了,来看代码:
A:
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function(s, numRows) {
//缓存数组,里面元素的个数为numRows,cache[0]为第一行的,cache[1]为第二行的...
var cache = [];
var currow = 0;
var isUp = false;//向上走还是向下走
for(var i = 0;i < s.length;i++){
if(currow === 0){//当前为第一行
isUp = false;
}else if(currow === numRows - 1){//最后一行
isUp = true;
}
//这里注意要初始化下数组
if(cache[currow] === undefined)
cache[currow] = '';
cache[currow] += s[i];
if(isUp){
currow--;
}else{
currow++;
}
}
return cache.join('');
};
指针i是跟着字符串s走的,而指针currow是跟着cache数组走的。