有关编程面试的最常见问题之一就是:编写一个程序,用Java或任何其他语言查找数组中缺少的数字;

这种不仅在小型初创企业中被问到,而且还在谷歌,亚马逊,脸谱,微软等一些最大的技术公司中提出,主要是当他们访问知名大学的校园招聘毕业生时。

这个问题的最简单版本是:在100个整数的区域中找到缺失的元素,其中包含1到100之间的数字。这可以通过使用n(n + 1)/ 2计算序列的总和来轻松解决。这也是最快捷有效的方法之一,但如果数组存在多个缺失的数字查找数组所有数字重复项,则无法使用它。

这给了面试官一些很好的后续问题,以检查候选人是否可以应用他对略有不同的条件的知识。因此,如果您完成此操作,他们会要求您在重复数组中找到缺少的数字。这可能很棘手但你很快就会发现在数组中找到缺失和重复数字的另一种方法是对它进行排序。

在排序数组中,您可以比较数字是否等于预期的下一个数字。或者,您也可以使用Java中的BitSet来解决此问题。

Java程序找到缺少的数字

让我们理解问题陈述,我们将1到100的数字放入整数数组中,找出丢失的数字的最佳方法是什么?如果面试官特别提到1到100,那么你可以应用上述关于系列总和的技巧,如下所示。如果它有多个缺少的元素,你可以使用位集合类,当然只有你的面试官允许使用它时。

1)系列之和:公式:n(n + 1)/ 2(但仅适用于一个缺失的数字)
2)如果一个数组有多个缺失元素,则使用BitSet。

我提供了一个BitSet另一个方式的解决方案,用这个很好的实用程序类来介绍。在许多面试中,我向Java开发人员询问了这个类,但是他们中的许多人甚至都没有听说过这个。我认为这个问题是学习如何在Java中使用BitSet的好方法。

顺便说一句,如果你要去面试,那么除了这个问题之外,很好它还知道 : [如何在Java中检查或检测数组中的重复元素] 和 [如何找到整数数组中的第二高数字]。通常情况下,在此之后会将这些问题作为后续问题。这些后续文章我们会第一时间在「公众号:Java知己」更新!

import java.util.Arrays;
import java.util.BitSet;/*** Java program to find missing elements in a Integer array containing * numbers from 1 to 100.** @author Javin Paul*/
public class MissingNumberInArray {public static void main(String args[]) {// one missing numberprintMissingNumber(new int[]{1, 2, 3, 4, 6}, 6);// two missing numberprintMissingNumber(new int[]{1, 2, 3, 4, 6, 7, 9, 8, 10}, 10);// three missing numberprintMissingNumber(new int[]{1, 2, 3, 4, 6, 9, 8}, 10);// four missing numberprintMissingNumber(new int[]{1, 2, 3, 4, 9, 8}, 10);// Only one missing number in arrayint[] iArray = new int[]{1, 2, 3, 5};int missing = getMissingNumber(iArray, 5);System.out.printf("Missing number in array %s is %d %n", Arrays.toString(iArray), missing);}/*** A general method to find missing values from an integer array in Java.* This method will work even if array has more than one missing element.*/private static void printMissingNumber(int[] numbers, int count) {int missingCount = count - numbers.length;BitSet bitSet = new BitSet(count);for (int number : numbers) {bitSet.set(number - 1);}System.out.printf("Missing numbers in integer array %s, with total number %d is %n",Arrays.toString(numbers), count);int lastMissingIndex = 0;for (int i = 0; i < missingCount; i++) {lastMissingIndex = bitSet.nextClearBit(lastMissingIndex);System.out.println(++lastMissingIndex);}}/*** Java method to find missing number in array of size n containing* numbers from 1 to n only.* can be used to find missing elements on integer array of * numbers from 1 to 100 or 1 - 1000*/private static int getMissingNumber(int[] numbers, int totalCount) {int expectedSum = totalCount * ((totalCount + 1) / 2);int actualSum = 0;for (int i : numbers) {actualSum += i;}return expectedSum - actualSum;}}
Output
Missing numbers in integer array [1, 2, 3, 4, 6], with total number 6 is
5
Missing numbers in integer array [1, 2, 3, 4, 6, 7, 9, 8, 10], with total number 10 is
5
Missing numbers in integer array [1, 2, 3, 4, 6, 9, 8], with total number 10 is
5
7
10
Missing numbers in integer array [1, 2, 3, 4, 9, 8], with total number 10 is
5
6
7
10
Missing number in array [1, 2, 3, 5] is 4

您可以看到使用正确的数据结构如何轻松解决问题。

这就是在这个使用程序找到100个元素数组中的缺失元素。正如我所说,知道这个技巧很好,它只需要你计算数字之和然后从实际总和中减去它,但是如果数组有多个缺失数字你就不能使用它。另一方面,BitSet解决方案更通用,因为您可以使用它在整数数组上查找多个缺失值。


关注公众号:「Java知己」,每天更新Java知识哦,期待你的到来!

  • 发送「1024」,免费领取 30 本经典编程书籍。
  • 发送「Group」,与 10 万程序员一起进步。
  • 发送「JavaEE实战」,领取《JavaEE实战》系列视频教程。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。

如何在1到100的整数数组中找到缺失的数字相关推荐

  1. 笔试题:在整数数组中找到重复的数字

    题目描述: java编码实现在整数数组中找到重复的数字,要求复杂度低于O(N*N) 解题思路: 我用两种方法进行解答,其一是用桶的思想,其二是排序 程序代码: public class Main {p ...

  2. python输入多个数字 找出只出现一个的数字_在python数组中找到接近给定数字的多个值...

    如果按照元素远离枢轴的顺序对数组进行排序,那么您将能够获取前k个元素,这些元素最接近您正在查看的元素 def k_closest(sample, pivot, k): return sorted(sa ...

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

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

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

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

  5. Java 高级算法——数组中查询重复的数字

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

  6. 返回数组个数Java_用java实现返回一个整数数组中最大数组的和

    今天研究了一下如何返回一个整数数组中最大数组的和,具体要求如下: 分析: 对于这个问题可以设定一个整型max,让他来充当子数组的和的最大值,之后就需要让他和所有的子数组进行比较,这里可以用两个for循 ...

  7. 整数数组中最大子数组求和02

    设计思路: 在"整数数组中最大子数组求和01"的基础上完成本次实验. 本次实验的关键在于如何判断结束. 经设计,程序结束条件有两种:1.截取部分有重复:2.循环完整两次. 满足其中 ...

  8. c语言经典算法——查找一个整数数组中第二大数

    https://www.cnblogs.com/dootoo/p/4473958.html 题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大 ...

  9. 结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)

    一.题目及题目要求 题目:返回一个整数数组中最大子数组的和. 要求: (1)输入一个整形数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)如果 ...

最新文章

  1. android GLSurfaceView渲染模式
  2. 数据库中字段类型对应的C#中的数据类型
  3. ie8 js未指明的错误_修复ueditor百度编辑器在IE8下shCore.js报错'undefined'错误的问题...
  4. windows。forms.timer设置第一次不等待_适用于初学者的中线交易策略——金叉的三种设置条件...
  5. 刚刚,“国民”APP微信崩了!官方致歉:已经逐步恢复
  6. Linux安全加固--系统相关
  7. 华硕主板无盘启动bios设置_legacy和UEFI启动是什么?电脑BIOS设置开启进入UEFI启动方法...
  8. 据说IE7.0不支持跨域名脚本,那网页计数器不是要失效啦?
  9. c语言编程怎样进行反函数计算器,反函数计算器
  10. c语言中math的作用,C语言Math函数库简介
  11. 光环PMP ITTO
  12. Vuex持久化,刷新,vuex-along最详细教程
  13. githut管理vs2012代码
  14. ES 数据聚合、数据同步、集群
  15. 品搜妞——百度、谷狗、搜狗的女人三围
  16. 天玑9000和高通骁龙870哪个好
  17. 分布式系统常见问题总结
  18. 批量安装系统工具cobbler配置
  19. cerr与cout的区别
  20. Spark系列之SparkSubmit提交任务到YARN

热门文章

  1. JavaScript Web APIs
  2. 搞笑--为毛我顶多是个包工头
  3. 计算机开机反复启动,电脑开机后反复重启原因 电脑开机后反复重启解决方法【详解】...
  4. 【传感器大赏】酒精传感器
  5. 微信公众号简单接入springboot集成weixin4j
  6. 开发人员和产品人员对接需求总结
  7. 自学Java day12 使用jvav实现链表 从jvav到架构师
  8. ARM开发工具历史及分类详解 (最详尽的区分和介绍ARM DS-5,RVD...
  9. STM32标准库修改HSI时钟教程
  10. PRN(20200908):Frosting Weights for Better Continual Training