美文网首页
位运算符应用举例(二)

位运算符应用举例(二)

作者: 一个栗 | 来源:发表于2021-06-11 10:18 被阅读0次

1.缺失的数字

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

  • 思路:考虑“异或”操作的定义,当两个操作数的对应位不相同时,该数的对应位就为1.也就是说如果是相等的两个数“异或”,得到的结果就是0,而0与任何数字“异或”,得到的是那个数字本身。所以我们考虑将所有的数字做“异或”操作,因为只有一个数字消失,那么其他两两出现的数字“异或”后为0,0与仅有的一个数字做“异或”,我们就得到了消失的数字是那个
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 如果有两个数字意外丢失了(丢失的不是相等的数字),该如何找到丢失的两个数字?

  • 思路:设题目中这两个只出现一次的数字分别为 A 和 B ,如果能将 A、B 分开到两个数组中,那显然符合“异或”解法的关键点了。因此这个题目的关键点在于将 A、B 分开到两个数组中。由于A、B 肯定是不相等的,因此在二进制上必定是有一位不同的。根据这一位是 0 还是 1 可以将 A、B 分开到 A 组和 B 组。而这个数组中其他数组要么属于 A 组,要么属于 B 组,再对 A 组和 B 组分别执行“异或”解法就可以得到 A、B 了。而要判断 A、B 在哪一位上不同,只要根据“ A 异或 B ”的结果就知道了,这个结果在二进制上为 1 的为都说明 A、B 在这一位上是不同的。
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 数组中,只有一个数出现一次,剩下的都出现三次,找出出现一次的数字

相关文章

  • 位运算符应用举例(二)

    1.缺失的数字 1.1 很多成对出现的正整数保存在磁盘文件中,注意成对的数字不一定是相邻的。如2、3、4、3、4、...

  • 位运算符应用举例

    位运算在 LeetCode 上有一些练习题,没想到 张杰 老师在讲 Swift 的同时,还会举几个例子。这几个例子...

  • 位运算符

    常用位运算符: 左移与右移运算符应用举例: 注意:&和|既是逻辑运算符,也是位运算符。如果两侧操作数是boolea...

  • 位运算符应用举例(一)

    1.两个数字交换 不借助临时变量,交换两个变量的值 2.求无符号整数二进制中1的个数 2.1 给定一个无符号整数变...

  • C语言的位操作(Two)

    一、位运算赋值运算符 闲话就不多说,直接上图咯。 位运算赋值运算符 二、位运算应用 **eg:取一个整数a从右端开...

  • 3、小众运算符の大课堂(一)

    较为简单の位运算符: & 位与运算| 位或运算^ 位异或运算~ 位取反运算 举例: 要做位运算,首先要把数据转...

  • 算法整理(1) 位运算相关

    运算符 位运算符用来对二进制位进行操作,Java中提供了如下的位运算符:位运算符中,除 ~ 以外,其余均为二元运算...

  • Python基础之位运算符(含原码反码补码的通俗解释)

    目录 1 二进制 2 原码、反码、补码 3 位运算符 4 位运算符使用技巧 上回学习运算符时,漏了位运算符,因为位...

  • 3、运算符、字符串、分支

    Lesson_3 【5】位运算符 位运算符:按位运算符是把数字看做二进制数来进行计算& 按位与运算符 相应的位数都...

  • shell系列3-运算符

    一. 数值运算符 整数判断: 二. 算数运算符 三. 字符串判断 四. 逻辑运算符 五. 位运算符 位运算符在Sh...

网友评论

      本文标题:位运算符应用举例(二)

      本文链接:https://www.haomeiwen.com/subject/lbcmsltx.html