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;
}
}
<剑指offer 面试题3> 数组中重复的数字(Java实现)
最新推荐文章于 2019-12-16 23:12:16 发布