位运算符应用举例(二)

2021-06-11  本文已影响0人  一个栗

1.缺失的数字

1.1 很多成对出现的正整数保存在磁盘文件中,注意成对的数字不一定是相邻的。如2、3、4、3、4、2......,由于意外有一个数字消失了,如何尽快找到是哪个数字消失了?

func findLostNum(nums:[UInt]) -> UInt {
    var lostNum:UInt = 0
    for num in nums {
        lostNum = lostNum ^ num
    }
    return lostNum
}
print(findLostNum(nums: [1,2,3,4,3,2,1]))

打印结果如下:
4

1.2 如果有两个数字意外丢失了(丢失的不是相等的数字),该如何找到丢失的两个数字?

func findLostTwoNum(nums:[UInt]) ->(UInt, UInt) {
    var lostNum1:UInt = 0
    var lostNum2:UInt = 0
    var temp:UInt = 0
    // 计算两个数的异或结果
    for num in nums {
        temp = temp ^ num
    }
    // 找到第一个为1的位
    var flag:UInt = 1
    while ((flag & temp) == 0) {
        flag = flag << 1
    }
    // 找到丢失的两个数字
    for num in nums {
        if (num & flag) == 0 {
            lostNum1 = lostNum1 ^ num
        } else {
            lostNum2 = lostNum2 ^ num
        }
    }
    return (lostNum1, lostNum2)
}
print(findLostTwoNum(nums: [1,2,3,4,3,2,1,5]))

打印结果如下:
(4, 5)

1.3 数组中,只有一个数出现一次,剩下的都出现三次,找出出现一次的数字

上一篇下一篇

猜你喜欢

热点阅读