问题是:字符串“ PAYPALISHIRING”以之字形模式写在给定的行数上,如下所示:(您可能希望以固定字体显示此模式,以提高可读性)
P A H N
A P L S I I G
Y I R
然后一行一行地读取:“ PAHNAPLSIIGYIR”
我已经在下面的代码中编写了代码,看来它可以正常工作,但是我可能会错过一些极端情况。您能帮我在我的答案中找到该问题的所有极端案例吗?
public static String zigZagConversion(String s , int rowNum){
if (s == null){
throw new IllegalArgumentException();
}
if (rowNum == 1){
return s;
}
StringBuilder str = new StringBuilder();
int step = 2 * rowNum - 2 ;
for (int i = 0 ; i < rowNum ; i++){
if( i == 0 || i == rowNum -1){
for (int j = i ; j < s.length() ; j +=step){
str.append(s.charAt(j));
}
}
else{
int step2 = 2* (rowNum - i - 1);
int step3 = step - step2;
int k = i;
boolean flag = true;
while (k < s.length()){
str.append(s.charAt(k));
if(flag){
k += step2;
flag = false;
}
else{
k +=step3;
flag = false;
}
}
}
}
return str.toString();
}
最佳答案
它为"PAYPALISHIRING", 4
提供了错误的输出
P I N
A L S I G
Y A H R
P I
因此正确的答案应该是
PINALSIGYAHRPI
。但是您的程序给出了
PINALIGYAIHRNPI
:缺少“ S”,一个额外的“ I”和一个额外的“ N”。
您的修订版本仍然不正确,给出了
PINALSIIGYAHNPI
。问题出在中间的
while
循环中。您需要改变步数,
开启和关闭
flag
。您的错误是仅将其关闭一次,再也不会重新启动。
str.append(s.charAt(k));
if (flag) {
k += step2;
flag = false;
} else {
k += step3;
flag = true;
}
经过这次更正,我相信您的解决方案是正确的。 (我还在那里做了一个小的改进,从if-else分支中提取了常见的
str.append(s.charAt(k));
。