题目如下:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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" 解释:L D R E O E I I E C I H N T S G
我的解题思路很简单,第一层和最后一层处理方式一致,中间的所有层处理方式也一致。按照字符串索引顺序排列如下所示:
当numRows =5时
0 | 8 | 16 | ||||||
1 | 7 | 9 | 15 | 17 | ||||
2 | 6 | 10 | 14 | 18 | ||||
3 | 5 | 11 | 13 | 19 | ||||
4 | 12 | 20 |
第一层和最后一层元素索引排布是存在规律的,numRows =5时,两个相邻元素之间的索引差是(2*numRows -2),题目没有要求加入空格和换行,所以这个可以不用管它,还有一个比较重要的是在向结果字符串中加入字符的时候要判断索引是否溢出,每次都要。
中间的几层比较麻烦,这题其实主要想让我们做的还是抽象出其中的数学规律,只要能找到规律这题还是很容易的。中间的几层我是这样做的:每(numRows -1)个字符为一个单位,包括字符,拿我举的例子说明,图片中的第二行头四个字符为一个单位,分别为索引为1的字符,空格,空格,索引为7的字符。这样每一组的元素排布都是规律的,第一个元素都是字符,在第二个元素之前有空格,空格数有规律,然后就是第二个元素,在第二个元素之后也有空格,空格的数量也是有规律,同理,第二行,第三行也能这么处理,空格的数量有什么规律建议自己想一下,很简单的,我就不赘述了,可以给你一点提示,是和位于哪一层和numRows 有关。
代码如下:
class Solution {
public:bool judge(int j,int size){return j < size;}string convert(string s, int numRows) {int size = s.length();string str;if (numRows > 1){for (int i = 0; i < numRows; i++){int j = i;if (i == 0 || i == numRows - 1){while (j < size){str += s[j];j += (numRows * 2 - 2);}}else{while (judge(j,size)){str += s[j];j += 2;for (int m = 0; m < numRows - 2-i; m++){j += 2;}if (judge(j, size)){str += s[j];}else{break;}for(int m = 0; m < i-1; m++){j += 2;}j += 2;}}}return str;}else{return s;}}
};