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

来源:互联网 发布:大数据前沿技术 编辑:程序博客网 时间:2024/06/03 22:42
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;elsebreak;}if(count>(mid-start+1))end=mid;elsestart=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
原创粉丝点击