java从数组查找指定整数

自从我讨论任何编码或算法面试问题以来已经有很长时间了,因此我想重新考虑一种最流行的基于数组的编码问题,即在给定数组中查找缺失的数字。 在进行编程工作面试之前,您可能已经听说过或看到过此问题,但是面试官通常会使用许多不同的版本来提高难度,以使候选人感到困惑并进一步测试其适应频繁变化的能力。 在过去,我已经证明了如何找到一个排序的数组缺少的数量以及使用的BitSet(见Java中的无序整数数组这里 ),但是,只有一个丢失的数量,没有任何重复。

这使问题有些容易,但是如果面试官告诉您数组包含重复项并且缺少多个数字,您该怎么办 好吧,这就是我们将在本文中讨论的内容,但是在此之前,让我们正确地获取问题说明。

1.问题陈述:

您给定了一个大小为N的整数数组。该数组包含从1到N-1的数字,但是在包含重复项的数组中缺少几个数字。 编写一个Java程序以打印序列中缺少的数字。

例如,如果给定数组为
{1,1,2,3,5,5,7,9,9,9}那么它的长度
10,其中包含1到9之间的数字。在这种情况下,缺少的数字是4、6和8。

2.解决方案:

当你看到的问题是找到阵列失踪人数 ,你可能会认为我们前面的解决方案计算所有数字的总和 ,并从预期的总和扣除它来寻找失踪的数字,但不幸的是不会在这种情况下工作,因为更多缺少一个数字 ,并且其中包含重复项。

在这种情况下,我们需要使用其他方法,例如您在学校看到的点名通话。

老师有一个列出所有学生姓名的登记册,他在列表中遍历并用红色标记缺席。 我们可以使用相同的方法来查找列表中所有缺少的数字。

我们可以将数组用作寄存器,并将索引用作数字名称。 我们遍历给定的数组,并通过存储它们各自的索引之一来标记所有存在的数字。 例如,如果给定数组中的第一个数字为5(因为未对数组进行排序),则我们将1存储在索引5中,例如register[5] = 1

给出所有数字后,就可以遍历寄存器数组并打印所有值为零的索引。 这些人缺席或缺席。

该解决方案对于重复项也是安全的,因为如果一个数字出现一到两次,我们只需将1存储在相应的索引中即可。

3.代码:

现在,我们知道如何解决带有重复项的未排序整数数组中的数字丢失的问题,是时候将该解决方案转换为代码并运行Java程序了。

/** Java Program to find missing numbers in an integer* array with duplicates. Array may contains more* than one duplicates.* * input: {1, 1, 2, 3, 5, 5, 7, 9, 9, 9};* output: 4, 6, 8*/
public class Hello {public static void main(String[] args) {// given inputint[] input = { 1, 1, 2, 3, 5, 5, 7, 9, 9, 9 };// let's create another array with same length// by default all index will contain zero// default value for int variableint[] register = new int[input.length];// now let's iterate over given array to// mark all present numbers in our register// arrayfor (int i : input) {register[i] = 1;}// now, let's print all the absenteesSystem.out.println("missing numbers in given array");for (int i = 1; i < register.length; i++) {if (register[i] == 0) {System.out.println(i);}}}}
Output
missing numbers in given array
4
6
8

这是解决此问题的最简单的Java程序。 您可以看到我们已经对输入数组进行了硬编码,但是您也可以修改程序以通过使用Scanner类从用户获取输入,如本示例所示。

该代码与解决方案完全相同,我们通过复制原始数组的长度来创建另一个数组,并使用它标记存在的数字。

由于数组索引也是整数,并且它们在输入值的范围内,因此我们可以利用它们将其用作数据和元数据。 如果数组中包含的数字不在1到N-1之间,那么我们就不能使用数组。

以下是幻灯片中算法和代码摘要,以使您更好地理解:

4.分析

现在,是时候分析我们的解决方案,以便使用Big O表示法查找CPU和内存的复杂性。 如果看一下代码,您会发现我们正在创建另一个具有相同大小的数组,这意味着它的内存或空间复杂度为O(n)

这意味着如果数组太大,即包含整数范围内的所有数字,那么我们将有更多的内存可能不可用,并且我们的程序可能会在Java中抛出OutOfMemoryError 。 因为阵列需要连续的内存块,所以这甚至更有可能。

因此,如果我们可以删除实际上没有容纳任何内容的附加数组,并找到一种方法来存储丢失的数字,而该数字远远小于我们可以改进此解决方案的所有数字,那么您会想到的。

对于时间复杂度 ,您可以看到我们遍历整个数组以标记所有存在的数字,然后再次遍历相同长度的另一个数组以查找缺席者。 这意味着该解决方案的时间复杂度为O(n)+ O(n)或O(2N),仍为Big O表示法仍为O(n)

如果我们找到在给定数组中进行迭代时打印缺席者的方法,则可以进一步改进此解决方案。 再说一遍,你们要想一想。

这就是在给定的整数array中查找缺失数字的经典问题 。 在这一部分中,我们找到了一种在未排序的数组中查找重复项的多个缺失数字的解决方案。 我们解决方案的时间和空间复杂度为O(n)。

翻译自: https://www.javacodegeeks.com/2018/04/how-to-find-k-missing-numbers-in-integer-array-with-duplicates-in-java.html

java从数组查找指定整数

java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...相关推荐

  1. 如何在Java中使用重复项查找整数数组中的K个缺失数字?

    自从我讨论任何编码或算法面试问题以来已经有很长时间了,因此我想重新考虑一种最流行的基于数组的编码问题,即在给定数组中查找缺失的数字. 在进行编程工作面试之前,您可能已经听说过或看到过此问题,但是面试官 ...

  2. LeetCode算法 删除有序数组中的重复项 删除有序数组中的重复项|| C++

    目录 题目 删除有序数组中的重复项 参考答案 题目 删除有序数组中的重复项|| 参考答案 题目 删除有序数组中的重复项 给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ...

  3. java在数组中放入随机数_如何在Java中随机播放数组

    java在数组中放入随机数 There are two ways to shuffle an array in Java. 有两种方法可以在Java中随机播放数组. Collections.shuff ...

  4. java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...

    在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...

  5. Linux查找文本中的重复项,2在Linux中查找和删除重复文件的有用工具

    如果您有从互联网下载各种内容的习惯,组织您的主目录甚至系统可能会特别困难. 通常,您可能会发现已下载相同的mp3,pdf,epub(以及所有其他文件扩展名)并将其复制到不同的目录中. 这可能会导致您的 ...

  6. Java界面可以放GIF吗_如何在java窗体中插入gif图

    动态网页制作 动态网页 组件简介 字幕 横幅广告管理器 悬停按钮 10.1 动态网页(Top) 而动态HTML(Dynamic HTML,缩写为DHTML),可让网页元素(文字.图像等)显示简单的动画 ...

  7. java通过按钮打开新窗口_如何在java程序中,当点击一个按钮后,关闭当前窗口,开启一个新的窗口。...

    JButton btn=new JButton(new AbstractAction("关闭并打开") {      @Override   public void actionP ...

  8. java如何实现tcp传输图像_如何在java中实现TCP服务器和TCP客户端传输文件

    我实现了简单的TCP服务器和TCP客户端类,可以从客户端发送消息到服务器,消息将在服务器端转换为大写,但是如何实现从服务器到客户端的传输文件,并从客户端上传文件到服务器.以下代码是我所得到的. TCP ...

  9. java 检测目录下的文件_如何在Java中检查文件是目录还是文件

    java 检测目录下的文件 java.io.File class contains two methods using which we can find out if the file is a d ...

最新文章

  1. Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI
  2. WindowManager如何被Android深度解析(2)
  3. 正则提取编码解码问题
  4. GPU(CUDA)学习日记(九)------ CUDA存储器模型
  5. 工业4.0时代,工业交换机在智能电网建设中有什么作用?
  6. 微服务升级_SpringCloud Alibaba工作笔记0025---Nacos持久化切换配置
  7. 7、Java格式注意要点
  8. 修改ElementUI样式的几种方式
  9. gem ruby on rails 安装出错GemNotFoundException
  10. Python json.dumps() 自动缩进
  11. 20_星仔带你学Java之Java常用类
  12. HTML CSS整理笔记(建议收藏)
  13. 云脉文档管理系统高效管理海量纸质文档
  14. Git rm和rm --cached区别
  15. Web项目中手机注册短信验证码实现的全流程及代码
  16. 详细分析Win11与Win10哪个好用
  17. 摄影教室:数码摄影区域曝光法实用教程
  18. 虚幻四视角移动与场景搭建
  19. 电脑录屏软件哪个免费
  20. Java springboot+vue生成报纸排版页面的新闻官网

热门文章

  1. 牛客网 【每日一题】5月29日 管道取珠
  2. 201912-3 化学方程式
  3. 【数位DP】CF 54C,509C,431D,628D,855E,1245F,95D
  4. Comet OJ(Contest #14)-飞翔的小鸟【tarjan】
  5. jzoj3518-进化序列(evolve)【位运算】
  6. 高等数学超入门学习笔记
  7. 16、mysql中函数的创建和使用
  8. 28、jdbc操作数据库(5)
  9. 26、jdbc操作数据库(3)
  10. 42、Java服务内存OOM原因分析