<剑指offer 面试题3> 数组中重复的数字(Java实现)

public class Interview3 {
	/**
	 * 题目一:找出数组中重复的数字
	 * 在一个长度为N的数组里的所有数字都在0~n-1的范围内。
	 * 数组中某些数字是重复的,但不知道有几个数字重复了,
	 * 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
	 *思路:1、对数组进行排序,然后遍历,相同的输出
	 *    2、插入到哈希表中
	 *    3、与下标进行匹配,交换后,如果都在各自的位置上则没有重复的,否则就能找出重复的
	 *    
	 *    下面是思路三的实现
	 */
	public static boolean duplicate(int nums[],int n,int []dumpli){
		//首先判断数组输入的合法性
		boolean result=false;
		if(nums==null||nums.length<=1||n<=1)return false;
		for(int i=0;i<n;i++){
			if(nums[i]<0||nums[i]>n)
				return false;
		}
		for(int i=0;i<n;i++){
			while(nums[i]!=i){
				if(nums[i]!=nums[nums[i]]){
					int t=nums[i];
					nums[i]=nums[nums[i]];
					nums[nums[i]]=nums[i];
				}else
				{
					dumpli[0]=nums[i];
					result = true;
				}
			}
		}
		return result;
	}
	
	/**
	 * 题目二:不修改数组找出重复的数字
	 * 在一个长度为n+1的数组里的所有的数字都在1~n之间,
	 * 所以数组中至少有一个数字式重复的,请找出数组中任一个重复的数字,
	 * 但是不能修改输入的数组
	 * 思路:1、放到哈希表中
	 *     2、创建一个O(n)的辅助空间,复制到对应的下标下
	 *     3、二分查找法 数数组中1~m的数的个数与m+1~n的数字的个数
	 *     下面是思路3的实现
	 */
	public static int dumplication(int number[],int n){
		//判断输入的数组的合法性
		if(number==null||number.length==0)return -1;
		for(int i=0;i<number.length;i++){
			if(number[i]<1||number[i]>n)return -1;
		}
		int start=1;int end=n;
		while(start<=end){
			int mid=(start+end)/2;
			int count=countRange(number,n,start,end);
			if(end==start){
				if(count>1)
					return start;
				else
					break;
			}
			if(count>(mid-start+1))
				end=mid;
			else
				start=mid+1;
		}
		return -1;
	}
	//统计在特定的区间内的数字的个数,比如数组中1-7内的数字出现的次数
	private static int countRange(int number[],int n,int start,int end){
		if(number==null||n<=0)
			return 0;
		int count=0;
		for(int i=0;i<number.length;i++){
			if(number[i]>=start&&number[i]<=end)count++;
		}
		return count;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值