268、缺失数字-leetcode

找出序列中未出现数字的算法
博客围绕找出包含0到n中n个数的序列里未出现数字的问题展开。提出三种算法,一是用列表长度计算完整和再减去元素和;二是在数字有序时用完整数列和减nums中数字和;三是先排序列表再迭代查找。还给出Python3实现。

题目描述

  • 给定一个包含0,1,2,…,n中n个数的序列,找出0,…,n中没有出现在序列中的那个数。
  • 实例1:
输入:[3,0,1]
输出:2
  • 实例2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8

说明:
你的算法应该具有线性时间复杂度。你能否仅使用额外的常数空间来实现?

  • 算法设计与分析:
  • 三种方法:
  • 1、求出一个列表的长度->mid=(长度*长度+1)//2 ->mid-列表的元素之和–>得到没有出现的值
  • 2、完整数列的和-nums中数字的和(题目给出的数字有序的条件下)
  • 3、先将传入的列表排序,然后计算列表的长度,使用for的方式进行迭代。一个个比较没返回不存在的数字即可。注意python 的迭代方式最后是迭代完成所有的元素之后就完事了,但是这样并不能查找到后面的元素,所以,需要在后面加上j += 1,来控制数值往后读取下一个
  • 使用Python3的三种方法实现:
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        # 利害:总结出一个规律:
        # 方法一:求出一个列表的长度->mid=(长度*(长度+1))//2 ->mid-列表的元素之和-->得到没有出现的值
        # return 0 if nums ==[] else ((len(nums) * (len(nums) + 1))//2) - sum(nums)
    
        # # 方法二:完整数列的和-nums中数字的和(题目给出的数字有序的条件下)
        # sum_all = 0
        # for i in range(len(nums)+1):
        #     sum_all += i
        # # 使用内置的函数sum()
        # sum_num = sum(nums)
        # return sum_all - sum_num
        
        # 方法三:将列表的值拍完序之后,逐个对比:注意python里面的sorted()方法是需要加ed的不同于c++的sort()
        nums = sorted(nums)
        nums_len = len(nums)
        # j是在完整的列表里面的,最后返回j=0的情况就是nums=[],空值就是返回0,range(0,2)=[0,1]
        j = 0
        for j in range(0, nums_len):
            if nums[j] != j:
                return j
            j = j+1   # 模拟C++中的for循环的最后的j++,否则的换python的for是不会尝试往后找的,它负责迭代完成就完事
        return j         
### LeetCode Problem 268 Missing Number LeetCode 的第 268 题名为 **Missing Number**,其题目描述如下: 给定一个包含 `[0, n]` 中 `n` 个数数组 `nums`,找出其中缺失的那个数字。 #### 示例 ```plaintext 输入: nums = [3,0,1] 输出: 2 解释: 数组中缺少数字 2。 ``` 此问题可以通过多种方法解决,以下是两种常见的解决方案:一种基于求和公式的方法以及另一种利用位运算的技术。 --- #### 方法一:数学公式法 通过计算完整的序列总和减去实际存在的元素之和来找到缺失数字。对于长度为 `n` 的数组,理想情况下应有 `(n * (n + 1)) / 2` 的总和[^6]。 实现代码如下所示: ```python class Solution: def missingNumber(self, nums): expected_sum = len(nums) * (len(nums) + 1) // 2 actual_sum = sum(nums) return expected_sum - actual_sum ``` 这种方法的时间复杂度为 O(n),空间复杂度为 O(1)[^7]。 --- #### 方法二:位运算法 可以使用异或操作符 (`XOR`) 来解决问题。由于 XOR 运算具有交换律和结合律,并且任何数与其本身做 XOR 结果都为零,因此我们可以将索引与数值配对并执行 XOR 操作以得到最终结果[^8]。 具体实现如下: ```python class Solution: def missingNumber(self, nums): xor = 0 i = 0 for i in range(len(nums)): xor ^= i ^ nums[i] return xor ^ i + 1 ``` 该方法同样具备时间复杂度 O(n) 和空间复杂度 O(1) 的特性[^9]。 --- #### 总结 上述两种方式均能有效处理这个问题,选择哪种取决于个人偏好或者特定场景下的需求。如果更关注可读性和简洁性,可能倾向于采用数学公式的方案;而当希望减少溢出风险时,则可以选择位运算的方式。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值