面试题 17.19.消失的两个数字 ---- 位运算

题目链接

题目:

分析:

  • 之前我们做过一道类似的题目: <消失的一个数字>, 我们用的办法是用数组中的每个数字与带上消失的数字的数组中的数字进行^, 这样就得到了消失的数字
  • 但是我们这道题目, 如果按照上述方法, 得到的是两个数字a和b的^, 那么我们怎么将两个数字分开呢?
  • 其实后面就是<只出现一次数字III>的思路:
  • 对于异或后的结果, 如果某一bit位上是1, 说明这两个数字肯定是不同的, 因为^的规则是相同为0,相异为1
  • 那么我们可以根据这个特性, 将我们上述异或在一起的所有数字进行分组, 这一位bit位上为1的是一组, 为0的是一组, 那么每一组中, 一定是一个数字出现一次和其他数字出现两次的情况, 那么我们对每一组在进行异或, 就得到了这两个数字

总结分为以下三步:

  1. 将所有的数异或在一起
  2. 找到tmp上bit位为1的那一位x
  3. 根据x位的不同, 或分成两组分别异或

代码:

java 复制代码
class Solution {
    public int[] missingTwo(int[] nums) {
//1
        int tmp = 0;
        for (int x : nums) {
            tmp ^= x;
        }
        for (int i = 1; i <= nums.length + 2; i++) {
            tmp ^= i;
        }
//2
        int diff = 0;
        while (true) {
            if (((tmp >> diff) & 1) == 1)
                break;
            else
                diff++;
        }
//3
        int[] ret = new int[2];
        for (int x : nums) {
            if (((x >> diff) & 1) == 1) {
                ret[1] ^= x;
            } else {
                ret[0] ^= x;
            }
        }
        for (int i = 1; i <= nums.length + 2; i++) {
            if (((i >> diff) & 1) == 1) {
                ret[1] ^= i;
            } else {
                ret[0] ^= i;
            }
        }
        return ret;
    }
}
相关推荐
噢,我明白了8 小时前
表单的完整 CRUD 练习【极简个人记账本】(含前端后端链接mySQL)
java·前端·数据库·mysql
AI机器学习算法8 小时前
机器学习基础知识
数据结构·人工智能·python·深度学习·算法·机器学习·ai学习路线
通往曙光的路上8 小时前
mysql1
java
Tigshop开源商城12 小时前
『物流设置+SEO优化』Tigshop开源商城系统 JAVA v5.8.26 版本更新!
java·开源商城系统·tigshop
X journey14 小时前
机器学习进阶(13):支持向量机SVM
算法·机器学习·支持向量机
Tigshop开源商城14 小时前
『订单税率+收货地址校验国家字段』功能上新|跨境运营更高效,Tigshop开源商城系统 JAVA v5.8.23 版本更新
java·开源商城系统·tigshop
洛水水14 小时前
【力扣100题】30.二叉树的直径
算法·leetcode·职场和发展
REDcker14 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
gihigo199815 小时前
Bezier曲线曲面生成算法
算法
kobesdu16 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2