https://leetcode-cn.com/problems/n-repeated-element-in-size-2n-array/
在大小为 2N
的数组 A
中有 N+1
个不同的元素,其中有一个元素重复了 N
次。
返回重复了 N
次的那个元素。
示例 1:
输入:[1,2,3,3]
输出:3
示例 2:
输入:[2,1,2,5,3,2]
输出:2
示例 3:
输入:[5,1,5,2,5,3,5,4]
输出:5
提示:
4 <= A.length <= 10000
0 <= A[i] < 10000
A.length
为偶数
因为有N+1个不同元素,且N个元素相同,所以可以想到先进行排序,从第1个数开始向后找,如果找到相同的元素就返回该元素,否则从第二个开始找......
一、 排序后直接找
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int repeatedNTimes(int []A) {
if(A.length==2) //2个数组的话,只能是A[0]=A[1]
return A[0];
Arrays.sort(A, 0, A.length);
int ans=A[0],num=1;
for(int i=1;i<A.length;i++) {
if(A[i]!=ans) {
ans=A[i];
num=i;
}else {
num++;
if(num==A.length/2) { //数组下标是从0开始,这里是第N+1个了
return ans;
}
}
}
return ans;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String []arr1=sc.nextLine().split(",");
int []A=new int[arr1.length];
for(int i=0;i<arr1.length;i++) {
A[i]=Integer.parseInt(arr1[i]);
}
System.out.println(repeatedNTimes(A));
}
}
二、利用hashset去重(根据题目的特殊性,像2,7,3,7,3,5,3,4不是题目要求,应当如2,7,3,6,3,5,3,4,只有1个重复元素)
import java.util.HashSet;
import java.util.Scanner;
public class Main {
static int repeatedNTimes(int []A) {
HashSet<Integer> res = new HashSet<>();
for(int i=0;i<A.length;i++){
if(!res.add(A[i])){
return A[i];
}
}
return 0;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String []arr1=sc.nextLine().split(",");
int []A=new int[arr1.length];
for(int i=0;i<arr1.length;i++) {
A[i]=Integer.parseInt(arr1[i]);
}
System.out.println(repeatedNTimes(A));
}
}
其他做法见https://blog.csdn.net/qq_17550379/article/details/85228446,其中提到一个规律,如果我们不对数组进行排序的话,我们直接遍历数组。那么重复元素必然会有一对间隔0
或者间隔1
。