我为以下问题编写了代码,但输出不符合预期。我不知道我的代码是否有问题。逻辑似乎很好。任何人都可以看到我的代码是否有问题。
给定按升序排序的分数数组,如果数组包含3个相互不同的分数,则返回true,最多2个,例如{3,4,5}或{3,5,5} 。
我的源代码如下:
public boolean scoresClump(int[] scores) {
boolean result = false;
for(int i=0; i<scores.length-2; i++){
if((scores[i+1]-scores[i])<=2 && (scores[i+2]-scores[i+1])<=2){
result = true;
break;
}
}
return result;
}
This是该问题的链接。
答案 0 :(得分:2)
你走了。您之前的帖子没有考虑非相邻值之间的差异。
public boolean scoresClump(int[] scores) {
boolean result = false;
for(int i=0; i<scores.length-2; i++){
if((scores[i+2]-scores[i])<=2){
result = true;
break;
}
}
return result;
}
答案 1 :(得分:0)
您的for
循环应为for(int i=0; i<scores.length-2; i++){
,否则您将获得ArrayOutOfBoundsException
。
此外,您的break
应该在true
条件而非false
条件。目前,您的代码在第一组3个与条件不匹配的元素之后存在循环。
此外,如果它们已按升序排序,则无需执行Math.abs
答案 2 :(得分:0)
首先,如果您遇到错误或意外行为,您应该描述它是什么(例如预期和实际输出)。
在您的情况下,我可以在您的代码中发现至少一个错误:您在循环得分[i + 2]中访问。当我达到length-1时,你访问长度+ 1。即使访问长度+ 0也已经是错误,因为最后一个元素的索引长度为1。你没有显示你的完整代码,但我认为由于抛出异常导致调用函数的结果被解释为false。
此外,两次检查不是必需的,一次检查就足够了,因为您将在下一次迭代时执行下一次检查。
答案 3 :(得分:0)
试试这个:
public boolean scoresClump(int[] scores) {
boolean result=false;
for(int i=0; i<scores.length-2; i++){
if(Math.abs(scores[i]-scores[i+1])<=2 &&
Math.abs(scores[i+1]-scores[i+2])<=2 &&
Math.abs(scores[i]-scores[i+2])<=2){
result=true;
}
}
return result;
}