由于现在都在复习准备考研,所以只能保持每日一更或两日一更
问题描述
这里我发现一个错误,示例2的第二行字母 I 前面少了一个空格(但并不影响我们做题,因为题目不要求我们输出正确的格式,只需输出变换后的字符串,感兴趣的同学可以到文末的题源去看看题目)
解题思路
这道题就是个纸老虎,并不要求我们输出正确格式,所以我们也无需考虑空格数啥的(当然正确输出格式也不是什么难题),我们只需标出输入字符串的索引,寻找每一行索引的规律即可
假设有一个字符串:0123456789,行数为3,
则我们可以列出他的输出为
0 4 8
1 3 7 9
2 6
按照题目规定的输出顺序应为:048137926,
那么我们将行数扩到n,则可以总结出每一列,每一行的n的表达式,如下图:
按照这个思路进行代码设计,只需设置一个循环,用 i 做循环变量,i就是行数,用一个字符数组记录每一行输出的字符,这样最后输出一遍这个字符数组就行了,至于每一行结束的条件当然就是若按照算法得出的下一个索引超过了字符串长度的话就停止了,
比如0123456789的字符串,总共长度是10
0 4 8
1 3 7 9
2 6
第一行的下一个下标是12,所以第一行不继续循环转而计算下一行
代码
class Solution {
public String convert(String s, int numRows) {
if (numRows <= 1) {
return s;
}
char[] array = new char[s.length()];
int index = 0;
int n = (numRows - 1) * 2;
for (int i = 0; i < numRows; i++) {
int x = i;
while (x < s.length()) {
array[index] = s.charAt(x);
index++;
if (i == 0) {
x += n;
continue;
}
if (i == numRows - 1) {
x += n;
continue;
}
if ((x + i) % n == 0) {
x = x + 2 * i;
continue;
}
x = x + n - 2 * i;
}
}
return String.valueOf(array);
}
}