返回介绍

solution / 0200-0299 / 0268.Missing Number / README

发布于 2024-06-17 01:04:02 字数 5471 浏览 0 评论 0 收藏 0

268. 丢失的数字

English Version

题目描述

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

     

    示例 1:

    输入:nums = [3,0,1]
    输出:2
    解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

    示例 2:

    输入:nums = [0,1]
    输出:2
    解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

    示例 3:

    输入:nums = [9,6,4,2,3,5,7,0,1]
    输出:8
    解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

    示例 4:

    输入:nums = [0]
    输出:1
    解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。

     

    提示:

    • n == nums.length
    • 1 <= n <= 104
    • 0 <= nums[i] <= n
    • nums 中的所有数字都 独一无二

     

    进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?

    解法

    方法一:位运算

    异或运算的性质:

    • 任何数和 $0$ 做异或运算,结果仍然是原来的数,即 $x \oplus 0 = x$;
    • 任何数和其自身做异或运算,结果是 $0$,即 $x \oplus x = 0$;

    因此,我们可以遍历数组,将数字 $[0,..n]$ 与数组中的元素进行异或运算,最后的结果就是缺失的数字。

    时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度。

    class Solution:
      def missingNumber(self, nums: List[int]) -> int:
        return reduce(xor, (i ^ v for i, v in enumerate(nums, 1)))
    
    class Solution {
      public int missingNumber(int[] nums) {
        int n = nums.length;
        int ans = n;
        for (int i = 0; i < n; ++i) {
          ans ^= (i ^ nums[i]);
        }
        return ans;
      }
    }
    
    class Solution {
    public:
      int missingNumber(vector<int>& nums) {
        int n = nums.size();
        int ans = n;
        for (int i = 0; i < n; ++i) {
          ans ^= (i ^ nums[i]);
        }
        return ans;
      }
    };
    
    func missingNumber(nums []int) (ans int) {
      n := len(nums)
      ans = n
      for i, v := range nums {
        ans ^= (i ^ v)
      }
      return
    }
    
    function missingNumber(nums: number[]): number {
      const n = nums.length;
      let ans = n;
      for (let i = 0; i < n; ++i) {
        ans ^= i ^ nums[i];
      }
      return ans;
    }
    
    impl Solution {
      pub fn missing_number(nums: Vec<i32>) -> i32 {
        let n = nums.len() as i32;
        let mut ans = n;
        for (i, v) in nums.iter().enumerate() {
          ans ^= (i as i32) ^ v;
        }
        ans
      }
    }
    
    /**
     * @param {number[]} nums
     * @return {number}
     */
    var missingNumber = function (nums) {
      const n = nums.length;
      let ans = n;
      for (let i = 0; i < n; ++i) {
        ans ^= i ^ nums[i];
      }
      return ans;
    };
    
    class Solution {
      /**
       * @param Integer[] $nums
       * @return Integer
       */
      function missingNumber($nums) {
        $n = count($nums);
        $sumN = (($n + 1) * $n) / 2;
        for ($i = 0; $i < $n; $i++) {
          $sumN -= $nums[$i];
        }
        return $sumN;
      }
    }
    

    方法二:数学

    我们也可以用数学求解。求出 $[0,..n]$ 的和,减去数组中所有数的和,就得到了缺失的数字。

    时间复杂度 $O(n)$,其中 $n$ 为数组长度。空间复杂度 $O(1)$。

    class Solution:
      def missingNumber(self, nums: List[int]) -> int:
        n = len(nums)
        return (1 + n) * n // 2 - sum(nums)
    
    class Solution {
      public int missingNumber(int[] nums) {
        int n = nums.length;
        int ans = n;
        for (int i = 0; i < n; ++i) {
          ans += i - nums[i];
        }
        return ans;
      }
    }
    
    class Solution {
    public:
      int missingNumber(vector<int>& nums) {
        int n = nums.size();
        return (1 + n) * n / 2 - accumulate(nums.begin(), nums.end(), 0);
      }
    };
    
    func missingNumber(nums []int) (ans int) {
      n := len(nums)
      ans = n
      for i, v := range nums {
        ans += i - v
      }
      return
    }
    
    function missingNumber(nums: number[]): number {
      const n = nums.length;
      let ans = n;
      for (let i = 0; i < n; ++i) {
        ans += i - nums[i];
      }
      return ans;
    }
    
    impl Solution {
      pub fn missing_number(nums: Vec<i32>) -> i32 {
        let n = nums.len() as i32;
        let mut ans = n;
        for (i, &v) in nums.iter().enumerate() {
          ans += (i as i32) - v;
        }
        ans
      }
    }
    
    /**
     * @param {number[]} nums
     * @return {number}
     */
    var missingNumber = function (nums) {
      const n = nums.length;
      let ans = n;
      for (let i = 0; i < n; ++i) {
        ans += i - nums[i];
      }
      return ans;
    };
    

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
    列表为空,暂无数据
      我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
      原文