不同的方法带来不同的时空复杂度,其中第三种方法最好。
package com.nowcoder.community.java_test;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int lg = sc.nextInt();
int[] nums = new int[lg];
for (int i = 0; i < lg; i++) {
nums[i] = sc.nextInt();
}
int a = findRepeatNumber3(nums);
System.out.println(a);
}
//内存需求少,运行时间很长
public static int findRepeatNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] == nums[j]) {
return nums[i];
}
}
}
//没有重复的数返回-1
return -1;
}
//内存需求高,运行时间降低
public static int findRepeatNumber2(int[] nums) {
Set<Integer> dic = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
if (dic.contains(nums[i])) {
return nums[i];
}
dic.add(nums[i]);
}
return -1;
}
//最优方法 创建一个数组a,分别把原数组的数加入到数组a中,此时数组a数值加1,
// 当数组a数值大于1时,说明添加了两次,那么这个数一定出现了两次
public static int findRepeatNumber3(int[] nums) {
int[] arr = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
arr[nums[i]]++;
if (arr[nums[i]] > 1) {
return nums[i];
}
}
return -1;
}
}