Java场景下如何从含重复元素的数组中提取唯一不重复数值
问题逻辑缺口说明
现在写的代码跑完根本拿不到目标结果,核心问题有两个:
- 双重循环碰到相同元素就直接break,全程没有对元素的重复次数做统计,也没有标记哪些元素是重复出现的
- 没有任何结果收集、输出逻辑,就算完整跑完所有循环,也不会把符合要求的唯一值取出来
适配当前已写逻辑的优化方案
你已经写了Arrays.sort(list)做数组排序,排序后的数组会变成[3,3,3,5,5,5,5,6,6,9],所有相同值都是连续排列的,完全没必要用O(n²)复杂度的双重循环逐次比对所有元素,直接判断相邻元素就能把重复元素识别出来,把复杂度降到O(n):
- 遍历排序后的数组,对每个位置的元素做相邻值比对
- 首尾位置单独判断:首元素只需要和后一个位置比,尾元素只需要和前一个位置比
- 中间位置的元素只要和前后位置的值都不相等,就是要找的唯一值
对应改完的可运行代码:
import java.util.Arrays; public class FindSingleUnique { public static void main(String[] args) { int[] list = {5,3,5,5,5,6,6,9,3,3}; Arrays.sort(list); int target = -1; for (int i = 0; i < list.length; i++) { if (i == 0) { // 数组开头的元素,只需要对比后一位 if (list[i] != list[i + 1]) { target = list[i]; break; } } else if (i == list.length - 1) { // 数组末尾的元素,只需要对比前一位 if (list[i] != list[i - 1]) { target = list[i]; break; } } else { // 中间元素,同时对比前后两位,都不相等就是唯一值 if (list[i] != list[i - 1] && list[i] != list[i + 1]) { target = list[i]; break; } } } // 输出结果为预期的9 System.out.println(target); } }
补充替代方案:如果不想依赖排序逻辑,也可以直接统计每个元素的出现频率,筛选出出现次数为1的值,这种方案不需要提前打乱数组顺序,适配更通用的场景:
import java.util.Arrays; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; public class FindUniqueWithCount { public static void main(String[] args) { int[] list = {5,3,5,5,5,6,6,9,3,3}; Map<Integer, Long> countResult = Arrays.stream(list) .boxed() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); // 筛选出出现次数为1的元素,输出为9 countResult.forEach((num, count) -> { if (count == 1) { System.out.println(num); } }); } }
内容的提问来源于stack exchange,提问作者user14353018
相关产品推荐
相关产品推荐

