Missing Number --缺失的数字

本文介绍了一种寻找数组中缺失数字的算法,通过三种方法实现:求和比较、XOR运算和二分查找,并提供了对应的代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

For example,
Given nums = [0, 1, 3] return 2.

Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?

题意:这道题给我们n个数字,是0到n之间的数但是有一个数字去掉了,让我们寻找这个数字,要求线性的时间复杂度和常数级的空间复杂度。

思路:

    1.假设他们没有缺,求出他们的和,再减去他们真实的和就可以求出缺少的值;

    2.XOR运算,a^b^b=a  现在还没怎么明白代码;

    3.二分查找法,在给定数组有序的情况下。我们首先要对数组排序,然后我们用二分查找法算出中间元素的下标,然后用元素值和下标值之间做对比,如果元素值大于下标值,则说明缺失的数字在左边,此时将right赋为mid,反之则将left赋为mid+1。

1.代码实现:

class Solution {
    public int missingNumber(int[] nums) {
        int i,sum=0;
        int len = nums.length;
        for(int num :nums){
            sum+=num;
        }
        return len*(len+1)/2-sum;
}
}

2.代码实现:

public int missingNumber(int[] nums) {

    int xor = 0, i = 0;
    for (i = 0; i < nums.length; i++) {
        xor = xor ^ i ^ nums[i];
    }

    return xor ^ i;
}

3.代码实现:

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int left = 0, right = nums.size();
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] > mid) right = mid;
            else left = mid + 1;
        }
        return right;
    }
};

 

转载于:https://www.cnblogs.com/linwx/articles/7674269.html

### 找到数组中缺失数字 要解决此问题,可以采用多种方法。以下是基于提供的引用以及常见算法的一种高效解决方案。 #### 方法描述 假设我们有一个数组 `arr`,其包含从 7 到 45 的整数,但其中一个数字缺失。可以通过计算理论总和与实际数组元素之和之间的差值来找到缺失数字。这种方法的时间复杂度为 O(n),空间复杂度为 O(1)[^1]。 #### Java 实现代码 以下是一个完整的 Java 程序: ```java public class MissingNumberFinder { public static int findMissingNumber(int[] arr, int start, int end) { // 计算理论上从start到end的总和 int expectedSum = (end * (end + 1)) / 2 - ((start - 1) * start) / 2; // 计算数组中的实际总和 int actualSum = 0; for (int num : arr) { actualSum += num; } // 缺失数字即为两者的差值 return expectedSum - actualSum; } public static void main(String[] args) { // 假设输入数组是从7到45的范围内,但缺少一个数字 int[] arr = {7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45}; int missingNumber = findMissingNumber(arr, 7, 45); System.out.println("缺失数字是: " + missingNumber); // 输出应为12 } } ``` 上述代码通过数学公式 `(n*(n+1))/2` 来计算期望的总和,并减去数组的实际总和得到缺失数字[^4]。 --- #### 可选优化方案 如果数组较大或者存在多个缺失数字的情况,则可以考虑使用位运算(XOR)的方法。这种方法同样具有时间复杂度 O(n) 和空间复杂度 O(1) 的特性[^5]。 ##### XOR 方法实现 ```java public class MissingNumberUsingXOR { public static int findMissingNumberWithXOR(int[] arr, int start, int end) { int xorFullRange = 0; // 存储从start到end的所有数字的异或结果 int xorArray = 0; // 存储数组中所有数字的异或结果 // 对[start, end]范围内的所有数字进行异或操作 for (int i = start; i <= end; i++) { xorFullRange ^= i; } // 对数组中的所有数字进行异或操作 for (int num : arr) { xorArray ^= num; } // 结果就是xorFullRange ^ xorArray return xorFullRange ^ xorArray; } public static void main(String[] args) { int[] arr = {7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45}; int missingNumber = findMissingNumberWithXOR(arr, 7, 45); System.out.println("缺失数字是: " + missingNumber); // 输出应为12 } } ``` 这种 XOR 方法利用了异或运算的特点:任意数与其本身异或的结果为零,而任意数与零异或的结果为其本身。 --- #### 总结 以上两种方法都可以有效地解决问题。当数据规模较小时,可以选择简单的求和法;而对于大规模数据集或需要处理多缺失情况时,推荐使用更稳健的 XOR 法则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值