题目:给出N字字符串,要求我们按行输出每一个字符。
链接:6.N字型变换
根据N字上下循环的特点,可以联想到周期函数。
通过观察可以看出,周期为2 * (numRows - 1),但是我们要输出的是同行的字母,除了第一行和最后一行都不满足这个条件。
根据题面,走一遍N字,你能感觉得到,我们所要求的同行字母,其实就是从这走到下边,再走回来,从这走到上边,再走回来,看到这估计你就会有想法了。
没错,就是往下走有一个周期,往上走又是一个周期,我们只需要变换周期来找到同行字符即可
假设当前行号为 idx{ idx|1 ~ numsRows },那么到达下界所走的步数为(n - idx ),从下界走到当前行号也为(n-idx),那么往下走再回来就是2 * (n - idx),同理,走到上界走再走回来为2 * (idx - 1)
代码如下:
开关设一个就可以,码力不足写臭了
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1){ // 只有一行,直接返回就行了
return s;
}
boolean upflag = false;
boolean downflag = true;
int n = numRows;
String ans = "";
int loop = 0; // 当前下标的循环周期
for(int i = 0;i < n;i++){
int idx = i;
upflag = false;
downflag = true;
if(i == 0||i == n-1){
while(idx < s.length()){
ans += s.charAt(idx);
idx += 2*n-2;
}
}
else{
while(idx < s.length()){
if(downflag){
ans += s.charAt(idx);
loop = 2 * (n - (i + 1));
idx = idx + loop;
downflag = false;
upflag = true;
}else if(upflag){
ans += s.charAt(idx);
loop = 2 * ((i+1) - 1);
idx = idx + loop;
upflag = false;
downflag = true;
}
}
}
}
return ans;
}
}