/**
* 题目一:找出数组中的重复数字
*
* 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。
* 也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},
* 那么对应的输出是第一个重复的数字2。
* @author tangyejun
*/
本文给出这道题目的4种解法,希望能够帮到你。
public class findSameNumber {
public static void main(String args[]){
int[] a = {2,3,1,0,2,5,3};
System.out.println(solution4(a).toString());
}
public static List<Integer> solution1(int[] a){
int temp = 0;
Arrays.sort(a);
List<Integer> result = new ArrayList<Integer>();
for (int i = 0; i < a.length; i++) {
if (a[i] != i){
if (a[i] == a[a[i]]){
result.add(a[i]);
}else {
temp = a[a[i]];
a[a[i]] = a[i];
a[i] = temp;
}
}
}
return result;
}
// 暴力法
public static List<Integer> solution2(int[] a){
List<Integer> result = new ArrayList<Integer>();
for (int i = 0; i < a.length-1; i++) {
for (int j = i+1; j < a.length; j++) {
if (a[i] == a[j]){
result.add(a[i]);
}
}
}
return result;
}
// 利用hashset的唯一性
public static List<Integer> solution3(int[] a){
HashSet<Integer> hashSet = new HashSet<>();
List<Integer> result = new ArrayList<Integer>();
for (int value : a) {
if (!hashSet.add(value)) {
result.add(value);
}
}
return result;
}
// 牺牲空间换取时间的一种方法
public static List<Integer> solution4(int[] a){
List<Integer> result = new ArrayList<Integer>();
List<Integer> help = new ArrayList<Integer>(Collections.nCopies(a.length,0));
System.out.println(help.toString());
for (int i = 0; i < a.length; i++) {
if (help.get(a[i])!=1){
help.set(a[i],1);
}else {
result.add(a[i]);
}
}
return result;
}
}
本文介绍了一种常见的编程面试题——在一个长度为n的数组中查找重复的数字,数组中的数字范围在0到n-1。文章提供了四种不同的解决方案,包括排序法、暴力法、利用HashSet的唯一性和牺牲空间换取时间的方法。每种方法都有其特点和适用场景。
2374

被折叠的 条评论
为什么被折叠?



