问题是:字符串“ 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));

10-02 05:19