这个简单的题目花了我好长时间,必须承认我的算法水平太低了,ZigZag Pattern我都没弄清是什么样的,画了好几种转化结果,总是不能正确找出规律,没办法,只好上网查了一下ZigZag,可惜还是没找到正确的转化过程。最后,不得不找到别人对于这道题的实现代码,根据运行结果得知正确的转化过程(只是看了代码运行结果,没有参照代码),然后再根据正确的转化过程画出图,找到转化规律,最终才完成……
思路:
其实只要知道转化过程,画出图就可以看出规律,如下:
nRows=3
0 | 4 | 8 | 12 | |||
1 | 3 | 5 | 7 | 9 | 11 | 13 |
2 | 6 | 10 | 14 |
0 | 6 | 12 | 18 | |||
1 | 5 | 7 | 11 | 13 | 17 | 19 |
2 | 4 | 8 | 10 | 14 | 16 | 20 |
3 | 9 | 15 | 21 |
0 | 8 | 16 | 24 | |||
1 | 7 | 9 | 15 | 17 | 23 | 25 |
2 | 6 | 10 | 14 | 18 | 22 | 26 |
3 | 5 | 11 | 13 | 19 | 21 | 27 |
4 | 12 | 20 | 28 |
0 | 10 | 20 | ||
1 | 9 | 11 | 19 | 21 |
2 | 8 | 12 | 18 | 22 |
3 | 7 | 13 | 17 | 23 |
4 | 6 | 14 | 16 | 24 |
5 | 15 | 25 |
实现:
public class Solution {
public String convert(String s, int nRows) {
if(nRows == 1) {
return s;
}
StringBuffer result = new StringBuffer();
int n = (nRows - 1) * 2;
int length = s.length();
for(int j = 0; j * n < length; j++) {
result.append(s.charAt(j * n));
}
for(int i = 1; i < nRows - 1; i++) {
for(int j = 0; j * n + i < length; j++) {
int m = j * n + i;
result.append(s.charAt(m));
if(m + (n - i * 2) < length) {
result.append(s.charAt(j * n + i + (n - i * 2)));
}
}
}
for(int j = 0; j * n + nRows - 1 < length; j++) {
result.append(s.charAt(j * n + nRows - 1));
}
return result.toString();
}
}
总结:
感觉这个实现过程不算高明,需要学习的太多了,基础!基础!基础啊!!!