数组元素存在n-1/n+1的判断逻辑及Java代码错误排查
问题分析与代码修正
首先,咱们来看你的代码逻辑问题所在:你的内层循环判断完全搞反了方向!
原代码里的内层循环:
if(a[i]+1!=a[j]||a[i]-1!=a[j]){ isbean=0; }
这个逻辑的意思是:只要当前j对应的元素不是a[i]+1或者不是a[i]-1,就把isbean设为0。这显然不对——比如对于元素2,当j遍历到10的时候,这个条件成立,直接把isbean改成0,但后面明明有3(2+1)存在,却已经被错误地标记为不满足条件了。
正确的逻辑应该是:对于每个元素a[i],我们需要检查数组中是否存在至少一个元素等于a[i]+1或者a[i]-1。如果遍历完整个数组都找不到这样的元素,才把isbean设为0,并且可以提前跳出循环节省时间。
修正后的代码
static int isBean(int... a) { // 默认是符合条件的bean数组 int isbean = 1; for (int i = 0; i < a.length; i++) { // 为每个元素设置一个标记,默认找不到匹配的n-1或n+1 boolean found = false; for (int j = 0; j < a.length; j++) { // 检查当前j元素是否是a[i]的相邻数 if (a[j] == a[i] + 1 || a[j] == a[i] - 1) { found = true; // 找到就不用继续遍历了,跳出内层循环 break; } } // 如果遍历完都没找到,说明这个元素不满足条件,整个数组不是bean数组 if (!found) { isbean = 0; // 一旦有一个元素不满足,直接跳出外层循环,不用继续检查 break; } } return isbean; } public static void main(String[] args) { int[] arr = {2, 10, 9, 3}; System.out.println(isBean(arr)); // 现在会输出预期的1 }
关键修改点
- 为每个元素增加
found标记,用来追踪是否找到相邻数 - 内层循环找到匹配的相邻数后,立即标记
found=true并跳出内层循环,避免无效遍历 - 外层循环中,如果某个元素的
found仍然是false,直接将isbean设为0并跳出外层循环,提前终止判断 - 修正了判断条件的逻辑,从“只要不匹配就标记失败”改成“找到匹配就标记成功”
这样修改后,你的测试数组{2,10,9,3}就能正确返回1了,每个元素都能找到对应的相邻数:
- 2的相邻数是3(2+1)
- 10的相邻数是9(10-1)
- 9的相邻数是10(9+1)
- 3的相邻数是2(3-1)
内容的提问来源于stack exchange,提问作者Ramakanta Bisipa
相关产品推荐
相关产品推荐

