剑指offer——在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。

题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

方法一

已知数组为n,每一个数组都不超过n,根据这个条件,想要找出重复的数,我们可以新建一个boolean型数组,制作一张hash表,hash函数y=x,也就是将数组中的数作为Boolean型数组的下标值,相同的两个数在Boolean型数组中一定会有相同的下标。初始化Boolean型数组中的每一个元素为false,遍历数组中的每一个数,将数对应的下标所对应的boolean变为true,若角标对应的值已经为true,说明该数已经存在,保存即可。代码如下:

	private static boolean duplicate(int[] numbers, int length, int[] duplication) {
		boolean[] b=new boolean[length];
		for (int i = 0; i < length; i++) {
			if (b[numbers[i]]== false) {
				b[numbers[i]] = true;
			}
			else
			{
				duplication[0] = numbers[i];
				return true;
			}
		}
		return false;
	}

方法二:

直接利用java集合函数hashSet的特性,不允许存在重复元素。直接遍历数组,判断hashset集合中是否存在数组中的数,如果不存在,将数添加在集合中;若存在,输出该数,返回true即可。代码如下:

	private static boolean duplicate(int[] numbers, int length, int[] duplication) {
		HashSet< Integer> hashSet = new HashSet<Integer>();
		for (int i = 0; i < length; i++) {
			if (!hashSet.contains(numbers[i])) {
				hashSet.add(numbers[i]);
			}else {
				duplication[0] = numbers[i];
				return true;
			}
			
		}
		return false;
	}

总结

该题主要考察的还是对数组的理解,从效率上来讲,方法一效率更高。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值