请求排查最小化儿童年龄分组Java代码问题(组内年龄差≤1)
代码问题排查与正确实现
嘿,我来帮你看看这段代码的问题,以及如何修正它来实现你需要的功能。
首先,你的代码存在几个关键问题,导致它无法正确计算最少分组数:
核心问题分析
逻辑判断完全错误
你写的条件if(kids[k]-kids[i]!=0 || kids[k]-kids[i]!=1)永远为真——不管两个孩子的年龄差是多少,这个条件都会成立。比如:- 如果年龄差是0,那么
kids[k]-kids[i]!=1为真; - 如果年龄差是1,那么
kids[k]-kids[i]!=0为真; - 如果年龄差更大,两个条件都为真。
这意味着你的代码会不断触发分组计数,完全不符合需求。
- 如果年龄差是0,那么
循环与变量逻辑混乱
嵌套循环的终止条件i<kids.length-a和k<kids.length-b没有明确的业务意义,变量a和b的递增逻辑也没有对应到分组的实际规则。另外,kids[i] = kids[k]这行代码会修改排序后的数组,彻底破坏后续的判断基础。整体思路偏离需求
你的代码没有利用数组排序后的特性,也没有采用正确的贪心策略来最小化分组数。
正确的实现思路
因为我们已经对数组排序了,问题可以简化为:把数组分成最少的连续子数组,每个子数组中最大值与最小值的差不超过1(因为数组排序后,子数组内的元素是有序的,只要首尾元素差≤1,整个子数组的任意元素差都≤1)。
我们可以用贪心算法来实现:从左到右遍历数组,每次尽可能把最多的符合条件的孩子放到同一个组里,直到遇到年龄差超过1的孩子,再开启新的分组。
修正后的代码
import java.util.Arrays; import java.util.Scanner; public class KidAgeGrouping { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("Enter the number of Kids :"); int n = scan.nextInt(); int[] kids = new int[n]; System.out.println("Enter the ages of kids :"); for (int i = 0; i < n; i++) { kids[i] = scan.nextInt(); } Arrays.sort(kids); int groups = 0; int currentIndex = 0; while (currentIndex < n) { groups++; int currentAge = kids[currentIndex]; // 找到当前组的最远边界:所有年龄 ≤ currentAge + 1的孩子 int nextGroupStart = currentIndex; while (nextGroupStart < n && kids[nextGroupStart] <= currentAge + 1) { nextGroupStart++; } // 跳到下一个组的起始位置 currentIndex = nextGroupStart; } System.out.println(groups); } }
测试示例
输入你给出的测试用例:
13 2 2 2 3 3 3 4 4 4 5 5 6 7
代码会输出3,完全符合预期。
这段代码的逻辑很清晰:排序后,每次从当前位置开始,把所有年龄在currentAge和currentAge+1之间的孩子归为一组,然后继续处理剩下的孩子,这样就能得到最少的分组数。
内容的提问来源于stack exchange,提问作者nada virinchi
相关产品推荐
相关产品推荐

