如何在1到100的整数数组中找到缺失的数字

Java知己
有关编程面试的最常见问题之一就是:编写一个程序,用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 number
        printMissingNumber(new int[]{1, 2, 3, 4, 6}, 6);
 
        // two missing number
        printMissingNumber(new int[]{1, 2, 3, 4, 6, 7, 9, 8, 10}, 10);
 
        // three missing number
        printMissingNumber(new int[]{1, 2, 3, 4, 6, 9, 8}, 10);
 
        // four missing number
        printMissingNumber(new int[]{1, 2, 3, 4, 9, 8}, 10);
 
        // Only one missing number in array
        int[] 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实战》系列视频教程。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。

Java知己

每日福利

Java,可以使用一种称为“差分数组”的技巧来解决这个问题。首先,创建一个新的数组,其元素是原数组相邻元素的差值。因为原始数组已经按升序排列并且只有一个数字缺失,所以这个差分数组中会有一个连续的负数,代表缺失的那个数字。然后遍历差分数组找到第一个负数的位置,即可计算出缺失数字。 以下是具体的实现步骤: 1. 创建一个与原始数组长度相同的差分数组。 2. 遍历原数组,计算每个位置的差值并存储在差分数组对应位置。 3. 初始化两个变量,一个表示当前的累计差值,另一个表示上一个位置的累计差值,初始均为0。 4. 遍历差分数组,如果遇到累积差值小于0,说明之前积累的是一个完整的递增序列,而此时的累积差值是缺失数字减去上一个数的结果,因此通过累积差值加上1得到缺失数字。 5. 返回缺失数字。 这里是代码实现: ```java public int findMissingNumber(int[] nums) { int n = nums.length + 1; int[] diffArray = new int[n]; for (int i = 0; i < n; i++) { if (i < nums.length) diffArray[i] = nums[i] - (i == 0 ? 0 : nums[i - 1]); else diffArray[i] = i; } int cumulativeDifference = 0; for (int i = 0; i < n; i++) { cumulativeDifference += diffArray[i]; if (cumulativeDifference < 0) { cumulativeDifference++; return cumulativeDifference; } } throw new IllegalArgumentException("Invalid input: All numbers from 1 to N should be present"); } // 示例 int[] array = {1, 2, 4, 5, 6, 7}; System.out.println(findMissingNumber(array)); // 输出:3 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值