如何统计数组唯一值数量?需满足不可修改原数组等约束
解决数组唯一值统计且不修改原数组的问题
你的原代码之所以会修改输入数组,核心问题在于int[] temp = arr;这行只是把原数组的引用赋值给了temp,并没有创建新数组。所以后续对temp元素的修改,本质上就是直接修改原数组的内容,这就违反了“不可修改传入方法的参数数组”的约束。
符合所有约束的解决方案
下面是满足所有要求的代码,既不会修改原数组,也没有使用额外的数据结构,更没有排序:
public int countUnique(int[] arr) { int result = 0; for (int i = 0; i < arr.length; i++) { boolean isUnique = true; // 检查当前元素在之前的位置是否已经出现过 for (int j = 0; j < i; j++) { if (arr[i] == arr[j]) { isUnique = false; break; // 找到重复就提前退出循环,提升效率 } } if (isUnique) { result++; } } return result; }
代码逻辑解释
- 外层循环逐个遍历数组中的每个元素
- 对于每个元素
arr[i],我们只需要检查它在0到i-1的位置是否已经出现过:- 如果之前没出现过,说明这是一个新的唯一值,结果计数器加1
- 如果已经出现过,就跳过这个元素,不计数
- 整个过程完全不会修改原数组的任何元素,也没有创建额外的数组/字符串等数据结构,更没有排序操作。
示例验证
调用countUnique({1, 0, 1, 0, 1})时:
- i=0:没有前置元素,判定为唯一值,result=1
- i=1:和前置元素1不重复,判定为唯一值,result=2
- i=2:和i=0的元素重复,不计数
- i=3:和i=1的元素重复,不计数
- i=4:和i=0的元素重复,不计数
最终返回结果为2,和预期一致,且原数组保持{1, 0, 1, 0, 1}的初始状态完全不变。
内容的提问来源于stack exchange,提问作者Matt Joshi
相关产品推荐
相关产品推荐

