算法面试题,1-99的无序数组存在1对重复数如何最快找到重复的数
2018-02-09 17:01
393 查看
如题,假如我们有1-100的无序数组,其中有2个数是重复的,如何最快速的方式找到他。
先拿到1-100无序的数:
public List getRandomNumber() {
List<Integer> array = new ArrayList<Integer>();
for(int i=0;i<99;i++) {
array.add(i+1);
}
array.add(new Random().nextInt(99));
Collections.shuffle(array);
return array;
}
方案一
思想:用1^100(1到100的阶乘,也就是1+2+3+......100)减去给定数组的所有数的和,但此方案相对笨拙,需要至少循环数组一次并做计算。
public static void main(String[] args) {
List<Integer> numbers = getRandomNumber();
int sum =0;
for(int i = 0;i<numbers.size();i++) {
sum += numbers.get(i) - i;
}
System.out.println("重复的数为:"+sum);
}
方案二 (建议使用的方案)
思想: 遍历所有不重复的数放入到HashSet中,接收add的返回值,如若返回false即当前数为重复的数,也可适用于多数重复统计的场景。
public static void main(String[] args) {
List<Integer> numbers = getRandomNumber();
Set<Integer> sets = new HashSet<Integer>();
for(int i=0;i<numbers.size();i++) {
if(!sets.add(numbers.get(i))) {
System.out.println("重复的数为:"+numbers.get(i));
}
}
}
当前方式最坏的结果是循环一遍重复的数组。
先拿到1-100无序的数:
public List getRandomNumber() {
List<Integer> array = new ArrayList<Integer>();
for(int i=0;i<99;i++) {
array.add(i+1);
}
array.add(new Random().nextInt(99));
Collections.shuffle(array);
return array;
}
方案一
思想:用1^100(1到100的阶乘,也就是1+2+3+......100)减去给定数组的所有数的和,但此方案相对笨拙,需要至少循环数组一次并做计算。
public static void main(String[] args) {
List<Integer> numbers = getRandomNumber();
int sum =0;
for(int i = 0;i<numbers.size();i++) {
sum += numbers.get(i) - i;
}
System.out.println("重复的数为:"+sum);
}
方案二 (建议使用的方案)
思想: 遍历所有不重复的数放入到HashSet中,接收add的返回值,如若返回false即当前数为重复的数,也可适用于多数重复统计的场景。
public static void main(String[] args) {
List<Integer> numbers = getRandomNumber();
Set<Integer> sets = new HashSet<Integer>();
for(int i=0;i<numbers.size();i++) {
if(!sets.add(numbers.get(i))) {
System.out.println("重复的数为:"+numbers.get(i));
}
}
}
当前方式最坏的结果是循环一遍重复的数组。
相关文章推荐
- 有一个100万的数组,里边有两个是重复的,如何设计算法找到
- 面试题:在一个数组中有0-99之间的整数101个(数组无序),用高效方法找出其中的唯一的重复元素!
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 【大家来一起讨论吧】百度面试题,假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求:o(n),o(1)
- [算法]找到无序数组中最小的K个数
- 工具类:关于如何找到两个List数组中不同的数据的算法!
- [经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素
- 如何找到一个数组里面重复次数最多的数
- 算法面试题:如何判断单链表中是否存在环
- 假设数组a有n个元素,元素取值范围是1~n,如何判定数组是否存在重复元素
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 算法研究:如何将数组中的重复数据查找出来
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 面试题---数组中的元素相差为1,如何找到数t的位置
- 谷歌面试题--一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间
- 算法面试题之不修改数组找出重复的数字
- 算法面试题之数组中重复的数字
- 【算法】如何在有序的数组中找到一个数的位置(递归)
- java 中的经典算法 如何将有序数据打散,以及在数组中取数据如何做到结果不重复。
- 面试题2 需要获取1-100共100个整形数,并将这些数无序的存入数组中,写出你的算法。