面试题 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;
    }
}
相关推荐
振宇i9 分钟前
java 富文本转pdf
java·富文本·itextpdf
@Aurora.10 分钟前
数据结构手撕--【二叉树】
数据结构·算法
victd17 分钟前
什么是AutoRec?
算法
陈壮实的搬砖日记18 分钟前
抛硬币背后的秘密-通俗玩转二项分布
算法
柒七爱吃麻辣烫19 分钟前
访问Maven私服的教程
java·maven
前端 贾公子21 分钟前
力扣 83 . 删除排序链表中的重复元素:深入解析与实现
数据结构·算法
Y1nhl22 分钟前
力扣hot100_链表(3)_python版本
python·算法·leetcode·链表·职场和发展
oioihoii40 分钟前
C++23 中 constexpr 的重要改动
c++·算法·c++23
Tang102442 分钟前
Glide 4.x 版本的图片加载流程
java
振宇i1 小时前
Java 富文本转word
java·word·富文本·docx4j