当前位置: 首页 > news >正文

数组 找出重复的数字(不修改数组)

题目:

  • 在一个长度为n+1的数组中所有数组都在1~n 的范围内,所以数中至少有一数字是重复的;请找出数组中任意一个重复的数字,但不能修改原数组;

 

例如:

  • 输入长度为8(n+1)的数组{2,3,5,4,3,2,6,7},那么对应的输出重复的数字是2或3;

 

分析:

  • 假如没有重复的数字,那么在1~n(1~7)的范围内就只会有n(7)个数字;由于数组包含超过n(7)个数字,所以一定包含了重复的数字;
  • 我们从1~n(7)的数字从中间的数字m(4)分为两部分,前面一半为1~m(1~4),后面的一半为m+1~n(5~7);如果1~m(4)的数字超过m(4),那么重复的数字一定在这里面;
  • 意思就是:如果1~4的这个范围的数,在数组的中个数超过了4,那么就一定有重复的数;
  • 否则,另一半里面,一定包含重复的数字;
  • 然后我们可以继续把包含重复的区间一分为二,直到找到一个重复的数字;
  • 这个过程类似二分查找

 

A3.java

package No2_Array;

 

import java.util.Arrays;

 

public class A3 {

 

public void duplicate(int []a,int []num){

if(a.length<=0||a==null){

return ;

}

A3 a3 = new A3();

 

int k = 0;

 

int left = 1;

int right = a.length-1;

//当相等的时候,就是一个数,如果这个数的count大于1,则是重复数字

while(left <= right){

 

int mid = (left+right)>>1;//mid = 4,相当于/2

//不是递归调用,先比较左边的(这个左边的一段数,不是数组左边的数字,而是从从小到大,左半边的数),如果左边的数字大于该段数字的范围,就包含重复的数字

int count = a3.check(a, left, mid);

 

//直到最后才会剩下一个数字,判断最后的这一个数的个数是否大于1

if(left == right){

if(count > 1){//判断的仅剩最后一个元素,而且出现的次数还大于1,那就是重复的元素了

num[k++] = left;//放到数组里面

break;

}

else{

break;//如果没有找到元素,也退出

}

}

不是最后一个数,就一直判断二分

//这个是比较前一半

if(count > (mid-left+1)){//代表这里面有重复,然后缩小范围继续拆分

right = mid;

 

}

//这个是比较后一半

else{

//没有重复

left = mid+1;

}

 

}

 

}

//找每一段在该范围内[pq]的个数

public int check(int num[],int p,int q){

 

if(num == null){

return 0;

}

//比较某一段的数字,出现在整个数组中的次数,如果大于该段数字的范围,就是含重复的数

int sum = 0;

for(int i = 0;i < num.length;i++){

if(num[i] >= p && num[i] <= q){

sum++;

}

}

return sum;

}

 

 

public static void main(String[] args) {

// TODO Auto-generated method stub

 

int a[] = new int[]{2,3,1,4,0,3,2};

//用于存重复的数

int []num = new int[a.length];

 

new A3().duplicate(a,num);

 

//还有一种方法打印,不需要用for循环

System.out.println(Arrays.toString(num));

}

 

}

相关文章:

  • 加入强调语气,使用strong和em标签
  • java内置了优先队列PriorityQueue
  • Hadoop和分布式系统
  • c++ 指向类成员函数的函数指针
  • 数组流中的中位数
  • Java——观察者模式实例
  • 连续子数组的最大和
  • 礼物的最大价值
  • 最长不含重复字符的字符串
  • Mac下JDK的安装的配置
  • 第二阶段个人总结09
  • java并发
  • idea中Spring报错Exception in thread main java.lang.ClassCastException
  • How Spring Boot Autoconfiguration Magic Works--转
  • PriorityQueue优先级队列
  • 网络传输文件的问题
  • java正则表式的使用
  • JS函数式编程 数组部分风格 ES6版
  • Laravel核心解读--Facades
  • leetcode388. Longest Absolute File Path
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • pdf文件如何在线转换为jpg图片
  • SQLServer之创建数据库快照
  • Webpack 4 学习01(基础配置)
  • 官方解决所有 npm 全局安装权限问题
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 前端面试总结(at, md)
  • 全栈开发——Linux
  • 自定义函数
  • 【干货分享】dos命令大全
  • ​queue --- 一个同步的队列类​
  • #if #elif #endif
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $.ajax()
  • $refs 、$nextTic、动态组件、name的使用
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (一)为什么要选择C++
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .Net Winform开发笔记(一)
  • .net 按比例显示图片的缩略图
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET中 MVC 工厂模式浅析
  • .NET中GET与SET的用法
  • /proc/stat文件详解(翻译)