重复N次的元素(leetcode961)【String[]数组】

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

 

提示:

  1. 4 <= A.length <= 10000
  2. 0 <= A[i] < 10000
  3. 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。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值