📜  门| GATE-CS-2017(Set 2)|问题23(1)

📅  最后修改于: 2023-12-03 15:28:45.333000             🧑  作者: Mango

题目23: 查找缺失的数字

这是一道面试题,在一个数组中,存储了从1到n的数字,其中缺失了一个数字。你需要编写一个函数来找出缺失的数字。

输入格式

输入的参数是一个数组,其中存储了从1到n-1的数字,且每个数字只出现一次。

输出格式

输出缺失的数字。

示例
输入: [1, 2, 3, 4, 6, 7, 8]

输出: 5
解法

这道题可以用两种方式来解决。

方法一:求和法

首先,我们可以求出1到n的数字之和,然后再计算出给定数组中数字的和,两者相减就是缺失的数字。

def findMissingNumber(arr):
    n = len(arr) + 1
    total = n * (n + 1) // 2
    sum_arr = sum(arr)
    return total - sum_arr
方法二:异或法

这是一种更为巧妙的方法,它利用了异或的性质,相同的数字异或会变为0,而0与任何数字异或都不会变化。

我们将1到n的数字与给定的数组中的数字全部异或起来,最后得到的结果就是缺失的数字。

def findMissingNumber(arr):
    n = len(arr) + 1
    res = 0
    for i in range(1, n+1):
        res ^= i
    for num in arr:
        res ^= num
    return res
总结

以上两种方法时间复杂度均为O(n),但是求和法需要用到乘法和除法,可能会导致数据溢出。而异或法则较为简单,不会出现溢出现象。

如果您有其他更好的解法,欢迎在评论区分享!