数组最大元素需为其他元素至少两倍的Java代码排障求助
问题分析与代码修正
问题描述
需求:编写代码判断数组中的最大元素是否是其他所有元素的至少两倍,若满足条件则输出该最大元素的0-based索引,否则输出-1。
原代码
import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) { /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int [] x = new int [n]; for(int i=0;i<n;i++){ x[i]=sc.nextInt(); } int max=Integer.MIN_VALUE; int count=0; int i; for(i=0;i<n;i++){ if(max<x[i]){ max=x[i]; count=0; } if(max==x[i]){ count++; } } if(count>=2){ System.out.print(i); } else{ System.out.print("-1"); } } }
原代码存在的问题
- 核心逻辑缺失:完全没有实现「最大元素是其他元素至少两倍」的判断,仅统计了最大元素的出现次数,和需求完全不符
- 索引输出错误:循环结束后
i的值是数组长度n,并非最大元素的索引,输出结果完全错误 - 边界情况未处理:当数组长度为1时,没有其他元素,按需求应返回0,但原代码会返回-1
修正后的代码
import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] x = new int[n]; for (int i = 0; i < n; i++) { x[i] = sc.nextInt(); } // 处理数组长度为1的特殊情况 if (n == 1) { System.out.println(0); return; } // 第一步:找到最大值及其索引 int max = x[0]; int maxIndex = 0; for (int i = 1; i < n; i++) { if (x[i] > max) { max = x[i]; maxIndex = i; } } // 第二步:检查最大值是否是其他所有元素的至少两倍 boolean isTwice = true; for (int num : x) { // 跳过最大值本身 if (num == max) { continue; } // 如果存在元素的两倍大于最大值,直接不符合条件 if (num * 2 > max) { isTwice = false; break; } } // 根据判断结果输出 System.out.println(isTwice ? maxIndex : -1); } }
代码说明
- 特殊情况处理:数组长度为1时,直接返回索引0,因为没有其他元素,天然满足条件
- 找最大值与索引:遍历数组一次,记录下最大值和它的第一个出现位置(如果有多个最大值,只要有一个不满足条件就返回-1,所以取第一个索引即可)
- 条件验证:再次遍历数组,对每个非最大值元素检查
max >= num * 2,只要有一个元素不满足,就标记为不符合条件 - 结果输出:根据验证结果输出对应的索引或-1
内容的提问来源于stack exchange,提问作者user_program
相关产品推荐
相关产品推荐

