这是一个面试问题的“说一说”问题,我正在尝试使用下面的代码来解决它:
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将不会检查第二个表达式