思维训练(二)如何找到缺失的数

题目

在一个无序数组中有99个不重复的正整数,范围为1到100,唯独缺少1个1到100中的整数,如何找到缺失的整数

思路: sum(100)-sum(99)

拓展一: 一个无序数组里有若干正整数,范围1到100, 其中99个整数出现了偶数次,只有一个正整数出现了奇数次,如何找到这个奇数次的整数?

思路:每次出现数字,或二进制问题的时候,脑子里要有一个弦,异或xor
异或的特点是:不同为1,相同为0,所以一个数异或自身为0.
a xor b xor b = a
异或在java语言中也常用来 不借助第三方变量来交换两个数的值
以上为发散思维扩展
对于本题,将所有数异或,得到的结果就是这个奇次整数

拓展二: 一个无序数组里有若干正整数,范围1到100, 其中98个整数出现了偶数次,只有2个正整数出现了奇数次,如何找到这两个奇数次的整数?

所有数异或, 结果必不为0, 根据异或结果, 根据结果的某一位上的1, 和原数组所有数做 异或,将所有数分为ab两组, 则 两个奇数次的整数必然分别分在了ab组中,然后ab两组中的数再分别异或就好.
附上python代码:


def find_lost_num(array=[]):
    result = [0, 0]
    xor_res = 0
    for i in range(0, len(array)):
        xor_res ^= array[i]
    # 如果异或结果为0,说明array不合要求
    if not xor_res:
        raise ValueError
    # 确定两个整数的不同位,以此来做分组
    sep = 1
    while not xor_res & sep:
        sep <<= 1
    # 分两组 异或
    for i in range(0, len(array)):
        if array[i] & sep:
            result[0] ^= array[i]
        else:
            result[1] ^= array[i]
    return result


myarray = [1, 2, 3, 4, 5, 5, 4, 2]
print(find_lost_num(myarray))

拓展三: 如果是三个奇数次整数呢?

有前边两个铺垫,想必大家一定能举一反三了,有兴趣的可以在评论区和我交流探讨

猜你喜欢

转载自blog.csdn.net/xiaoxiaodechongzi/article/details/106049519