码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 力扣 面试题 17.19. 消失的两个数字


    题目来源:https://leetcode.cn/problems/get-kth-magic-number-lcci/submissions/

    大致题意:
    给一个数组,数组中有 n - 2 个元素,分别是 1 - n 中的 n - 2 个不同的数字,求出 1 - n 中不在数组中的那两个数字。
    要求时间复杂度为 O(n),空间复杂度为 O(1)

    思路

    对于这类要求在 O(1) 复杂度找出数组中符合某种规律的数,一般都使用位运算来解题

    对于该题,我们已知所有数都在 1 - n 中,于是可以直接求出 1 - n 的异或值,然后再对整个数组求异或值,那么该题其实类似力扣 剑指 Offer 56 - I. 数组中数字出现的次数

    位运算

    已知两个相同值异或的结果为 0,且异或满足交换律和结合律,那么将整个数组加上 1 - n 进行异或运算,只有 1 - n 中不在数组中出现的两个数在异或过程中出现了一次,其余数都出现了两次,也就是说,最终异或的结果相等于 1 - n 在数组没出现那两个数的异或值

    已知这两个数的异或结果,如果求出这两个数?

    可以用力扣 剑指 Offer 56 - I. 数组中数字出现的次数中的解法

    1. 求出异或值中最低位的 1,求出这个二进制值(比如异或结果为 10010100,这个二进制即为 100)。该位即为所求两个数对应二进制中不相同的最低位,此时 1 - n 的所有数可以分为两部分,在该位为 1 的、在该位为 0的
    2. 遍历数组,分别求出两组数的异或值
    3. 遍历 1 - n,分别求出两组数的异或值
    4. 将上述两组数异或值再进行异或,那么剩下的两个数即为所求数

    具体看代码:

    class Solution {
        public int[] missingTwo(int[] nums) {
            int xor = 0;
            int n = nums.length;
            // 计算 1 - n 的异或值
            for (int i = 1; i <= n + 2; i++) {
                xor ^= i;
            }
            int aXorB = xor;
            // 将上述异或值与整个数组进行运算,得到所求两个数的异或值
            for (int i = 0; i < n; i++) {
                aXorB ^= nums[i];
            }
            // 使用该方法可以快速求出异或结果二进制中最低位的 1
            int diff = aXorB & (-aXorB);
            int a = 0;
            int b = 0;
            // 分组对数组进行异或
            for (int i = 0; i < n; i++) {
                if ((nums[i] & diff) == 0) {
                    a ^= nums[i];
                } else {
                    b ^= nums[i];
                } 
            }
            // 分组对 1 - n 进行异或
            for (int i = 1; i <= n + 2; i++) {
                if ((i & diff) == 0) {
                    a ^= i;
                } else {
                    b ^= i;
                } 
            }
            // 返回结果
            return new int[]{a, b};
        }
    }
    
  • 相关阅读:
    RT-Thread Studio学习(十二)W25Q128(SPI)的读写
    聊聊如何解决官方提供的onpremise项目安装sentry速度过慢问题
    Docker 入门相关内容——环境安装,命令和概念
    一些网络的常见问题
    每天一个面试题:ThreadLocal底层原理和实现Demo
    java-net-php-python-ssm公司人力资源管理系统计算机毕业设计程序
    java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建
    SAP ABAP根据网址跳转至对应的网页
    “游蛇”黑产团伙专题分析报告
    从北斗到Mate 50:星空中的中国式浪漫
  • 原文地址:https://blog.csdn.net/csdn_muxin/article/details/127088694
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号