题目:在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但是不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3。

方法1:利用辅助函数,逐一把原数组的每个数字复制到辅助数组。如果原数组中被复制的数字是m,则把它复制到辅助数组中下标为m的位置。如果下标为m的位置上已经有数字了,则说明该数字重复了。由于使用了辅助空间,故该方案的空间复杂度是O(n)

public class Test1 {
public static int getReNum(int[] arr){
//传入参数出错
if(arr==null || arr.length==0){
return -1;
}
for(int i=0;i<arr.length;i++){
if(arr[i]<=0 || arr[i]>arr.length){
return -1;
}
}
//辅助数组
int[] temp=new int[arr.length];
for(int i=0;i<arr.length;i++){
if(temp[arr[i]]==arr[i]){
return arr[i];
}else{
temp[arr[i]]=arr[i];
}
}
return -1;
} public static void main(String[] args) {
int arr[]=new int[]{5,4,3,6,2,1,2};
int reNum = getReNum(arr);
System.out.println(reNum);
}
}

方法二:类似二分法

  由于分析一的空间复杂度是O(n),因此我们需要想办法避免使用辅助空间。我们可以这样想:如果数组中有重复的数,那么n+1个1~n范围内的数中,一定有几个数的个数大于1。那么,我们可以利用这个思路解决该问题。我们把从1~n的数字从中间的数字m分为两部分,前面一半为1~m,后面一半为m+1~n。如果1~m的数字的数目等于m,则不能直接判断这一半区间是否包含重复的数字,反之,如果大于m,那么这一半的区间一定包含重复的数字;如果小于m,另一半m+1~n的区间里一定包含重复的数字。接下来,我们可以继续把包含重复的数字的区间一分为二,直到找到一个重复的数字。

public class Test2 {
//传入一个数组,从开始位置和结束位置,有多少个数字
public static int getCount(int arr[],int start,int end){
int count=0;
for(int i=0;i<arr.length;i++){
if(arr[i]>=start && arr[i]<= end){
count++;
}
}
return count;
}
//查找重复的数字
public static int getReNum(int arr[]){
//传入数组不合法
if(arr.length==0 || arr==null){
return -1;
}
for(int i=0;i<arr.length;i++){
if(arr[i]<=0 || arr[i]>=arr.length){
return -1;
}
} int start=1;
int end=arr.length-1;
int mid=0;
int count=0;
while(end>=start){
if(start==end){
count=getCount(arr, start, end);
if(count>1){
return start;
}else{
break;
}
}
mid = (start + end) / 2;
count = getCount(arr, start, mid);
if (count > mid - start + 1) {
end = mid;
} else {
start = mid + 1;
}
}
return -1;
} public static void main(String[] args) {
int[] numbers = { 1, 3, 5, 4, 2, 1, 6, 7 };
int reNum = getReNum(numbers);
System.out.println(reNum);
}
}

剑指offer第二版面试题2:数组中重复的数字(JAVA版)的更多相关文章

  1. 【剑指Offer】面试题03. 数组中重复的数字

    题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意 ...

  2. 《剑指offer》面试题03. 数组中重复的数字

    问题描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...

  3. 剑指Offer(书):数组中重复的数字

    题目:找出数组中重复的数字. 说明:在一个长度为n的数组里的所有数字都在0~n-1的范围内,数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数 ...

  4. 剑指offer笔记面试题3----数组中重复的数字

    题目一:找出数组中重复的数字.在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如 ...

  5. 剑指offer第二版面试题11:旋转数组的最小数字(JAVA版)

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...

  6. 剑指offer第二版面试题1:数组中重复的数字(JAVA版)

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

  7. 剑指offer:1.找出数组中重复的数(java版)

    数组中重复的数:题目:找出数组中重复的数,题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任 ...

  8. 剑指offer第二版面试题3:二维数组中的查找(JAVA版)

    题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 1 2 8 9 2 4 ...

  9. 剑指offer第二版面试题4:替换空格(JAVA版)

    题目:请实现一个函数,把字符串中的每个空格替换成“%20”.例如输入“We are happy”,则输出”We%20are%20happy”. 原因:在网络编程中,如果URL参数中含有特殊字符,如:空 ...

随机推荐

  1. Java核心基础知识(一):概念、语法、使用、源码

    1. Java中OOP的特点? OOP(Object Oriented Programming):面向对象编程.具有封装.继承.多态三大特征. 封装:解决数据安全性问题: 继承:解决代码的重用性问题: ...

  2. Java学习之面向对象---继承

    继承:子继承父,子可以拥有父的所有. 继承的好处: 1.提高了代码的复用性 2.让类与类之间产生了关系.有了这个关系,才有了多态的特性 Java 只支持单继承,不支持多继承 class A { voi ...

  3. EmWin 如何显示汉字 不用在文件中使用编码

    1. Font Converter for emWin 生成C文件字库 1.1 新建文件 1.2 选择字体 1.3 为了减小C文件体积,这里只加入自己需要的汉字,先把所有字体取消选择. 1.4 新建一 ...

  4. python学习笔记:模块——os模块(操作文件/目录)

    import os os.rename(old,new) #重命名文件或目录 os.remove(f)#删除文件 os.mkdir('china/beijing') #创建文件夹 os.makedir ...

  5. 11.Jmeter 快速入门教程 -- jmeter事务控制器

    你肯定知道, jmeter是一个跨系统平台的性能测试工具, 比如他可以在linux,freebsd,windows,solaris 等等各种系统上可以运行. 我可以说, 事务 transaction ...

  6. 数据概览神器pandas_profiling

    安装: pip install pandas_profiling 用法如下: import pandas as pd import pandas_profiling df = pd.read_exce ...

  7. 获取Windows某一目录下的所有文件名

    #include <sys/types.h> #include <dirent.h>     std::vector<std::string> get_all_fi ...

  8. Redis Sentinel 高可用方案

      redis 主从复制的问题 Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用: 1,一旦主节点宕机,从节点作为主节点的备份可以随时顶上来. 2,扩展主节点的读能力,分担主节点读压 ...

  9. 【Neo4j查询优化系列】如何快速统计节点的关系数

    在图数据库中我们经常需要统计节点上的关系数目.一种常见的查询写法是这样的: MATCH (n:Person {name:'Keanu Reeves'})-[]-() RETURN count(*); ...

  10. 【转载】vue install报错run `npm audit fix` to fix them, or `npm audit` for details html

    原链接https://www.jianshu.com/p/60591cfc6952 执行npm install 出现如下提醒 added 253 packages from 162 contribut ...