这是一个面试问题的“说一说”问题,我正在尝试使用下面的代码来解决它:

public static String countAndSay(int n) {
    char[] c = new char[] { '1' };
    StringBuffer buffer = null;
    for (int i = 1; i < n; i++) {
        buffer = new StringBuffer();
        int start = 0;
        int len = c.length;
        for (int j = 1; j <= len; j++) {
            if (j == len || c[j] != c[start]) {
                buffer.append(j - start);
                buffer.append(c[start]);
                start = j;
            }
        }
        c = buffer.toString().toCharArray();
    }
    return new String(c);
}

public static void main(String[] args) {
    System.out.println(countAndSay(2));
}


这是问题的描述:
计数序列是从以下开始的整数序列:
1,11,21,1211,111221,...

将1读为“ 1”或11。将11读为“ 2 1”或21。将21读为“ 1 2,然后是1”或1211。给定整数n,生成第n个序列。

这是一个可运行的代码。但是对于if (j == len || c[j] != c[start])行,如果将其更改为if (c[j] != c[start] || j == len),则会出现错误java.lang.ArrayIndexOutOfBoundsException。我很困惑为什么两个条件的不同顺序对于OR运算符会有不同的结果。提前致谢!

最佳答案

if (j == len || c[j] != c[start])
true---^              ^------Expression is NOT evaluated

 if (j == len || c[j] != c[start])
false---^             ^------Expression is evaluated


如果第一个表达式是true,那么在OR运算符的情况下,JVM将不会检查第二个表达式

10-04 18:13