牛客网刷题-缺失数字

问题描述

从0,1,2,…,n这n+1个数中选择n个数,组成有序数组,找出这n个数中缺失的那个数,要求O(n)尽可能小。

输入描述:
输入一个数组(0-n)

输出描述:
输出缺失的数字

示例

示例1

输入
[0,1,2,3,4,5,7]

输出
6

解决思路

分析

  1. 通过循环
  2. 通过数学的思路,1-n的和为 n*(n+1)/2
  3. 通过异或的特性,计算结果
    相同的数字异或为0,任意数字与0异或都是原值

方法

  1. 通过循环,判断前后差值是否大于1
  2. 通过数学的思路,1-n的和为 n*(n+1)/2 ,依次减去所有的数,得到的结果为缺失的数字
  3. 通过异或的特性,假设数组0,1,3,4

temp = 4^(0^0)^(1^1)^(2^3)^(3^4)
=(4^4)^(0^0)^(1^1)^(3^3)^2
=0^0^0^0^2
=2

代码实现

// 思路1
public class Solution {
    
    
    public int solve(int[] a) {
    
    
        if (a == null || a.length == 0) {
    
    
            return -1;
        }

        for (int i = 1; i < a.length; i++) {
    
    
            if (a[i] - a[i - 1] > 1) {
    
    
                return a[i] - 1;
            }
        }

        return -1;
    }
}
public class Solution {
    
    
    // 通过数学的方法
    public int solveByMath(int[] a) {
    
    
        if (a == null || a.length == 0) {
    
    
            return -1;
        }

        int n = a[a.length - 1];
        int sum = n * (n + 1) / 2;
        for (int i = 0; i < a.length; i++) {
    
    
            sum -= a[i];
        }

        return sum;
    }
}
public class Solution {
    
    
    // 通过位运算
    public int solveByBitOperation(int[] a) {
    
    
        if (a == null || a.length == 0) {
    
    
            return -1;
        }

        int temp = a.length;
        for (int i = 0; i < a.length; i++) {
    
    
            temp ^= a[i] ^ i;
        }

        return temp;
    }
}

小伙伴如果想测试的话,可以直接到牛客网这个链接做测试

缺失数字-牛客网

猜你喜欢

转载自blog.csdn.net/qq_35398517/article/details/112996768