题目:
![](https://img-blog.csdnimg.cn/img_convert/917c51e88175aae9ba9c3bf5122a4f54.png)
这个题目意思挺好懂的,不过多解释了。
我的解题思路:
方法一:直接创建一个二维数组,按规则摆放,在按从左到右,从上到下读取。(这个方法是最容易想到的,同时时间复杂度和空间复杂度也是挺大的,这里不做实现)
方法二:直接计算出下一个元素的位置
如何计算出下一个元素的位置?
找出下一个元素和上一个元素的规律
numRows=3时
下图可以看出第一行元素每下一个元素相隔了三个元素
![](https://img-blog.csdnimg.cn/img_convert/060b7fefcc0fdf3a7bf7ed1282b7b65a.png)
下图可以看出第二行每下一个元素相隔一个元素
![](https://img-blog.csdnimg.cn/img_convert/c0ecaa9a7d7138c1e5265e4e0d2629fa.png)
第三行元素每下一个元素相隔了三个元素
numRows=4时
下图可以看出第一行元素每下一个元素相隔了5个元素
![](https://img-blog.csdnimg.cn/img_convert/f4b15ab3ac0a701a12c69d54961d96a6.png)
下图可以看出第二行元素每下一个元素下面的相隔了3个元素,上面的相隔1个元素
![](https://img-blog.csdnimg.cn/img_convert/821ebe607004fd997e922b251a2bc82a.png)
下图可以看出第三行元素每下一个元素下面的相隔了1个元素,上面的相隔3个元素
![](https://img-blog.csdnimg.cn/img_convert/e3e22f2e2fc04433a809c5b0c6c17a8a.png)
下图可以看出第四行元素每下一个元素相隔了5个元素
![](https://img-blog.csdnimg.cn/img_convert/46502c3a737c6b168b98edb0d06f40dc.png)
总结规律:
每隔numRows-1=3个元素为一组(也可以称为周期)
每组的第一个元素和下一个元素相隔1+2+2=5元素
每组的第二个元素和下一个元素相隔1+2=3元素
每组的第三个元素和下一个元素相隔1元素
如何求出当前组的元素处于当前组的第几个元素?
元素下标+1和周期取余,
如:P:(0+1)%3=1
I:(6+1)%3=1
![](https://img-blog.csdnimg.cn/img_convert/b8d16ac9800b0252a9f76bc0aa569c35.png)
java实现:
class Solution {
public String convert(String s, int numRows) {
//特殊情况处理,如:s="A",numRows=1
if (s.length() <= numRows || numRows == 1){
return s;
}
StringBuilder resultS = new StringBuilder(); //存放最后结果
int numRowsReturn = numRows-1; //翻转周期
//每个周期的位置元素距离下一个元素相隔多少个元素,第一个元素=1+2+2,第二个元素=1+2,第三个元素=1
int[] list = new int[numRowsReturn];
list[numRowsReturn-1] = 1;
for (int i = numRowsReturn-2; i >= 0; i--) {
list[i] = list[i + 1] + 2;
}
//元素摆放后遍历每行元素
for (int i = 0; i < numRows; i++) {
resultS.append(s.charAt(i));
int nextIndex = i+1+list[i % numRowsReturn]; //计算出下一个元素的下标
while (true){ //遍历每行的每个元素
if (nextIndex > s.length()-1){
break;
}
resultS.append(s.charAt(nextIndex));
nextIndex = nextIndex+1+list[nextIndex % numRowsReturn];
}
}
return resultS.toString();
}
}
![](https://img-blog.csdnimg.cn/img_convert/26bb5865fce35da4dc0fa0e8eb12bb5f.png)