【程序员面试金典】面试题 17.19. 消失的两个数字

这篇具有很好参考价值的文章主要介绍了【程序员面试金典】面试题 17.19. 消失的两个数字。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

描述:给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?

以任意顺序返回这两个数字均可。

示例 1:

输入: [1]
输出: [2,3]

示例 2:

输入: [2,3]
输出: [1,4]

提示:

nums.length <= 30000

解题思路

思路:最直观的想法是,位运算。消失的两个数字和只出现一次的两个元素,本质上是一样的。此处,先求出数组中元素的异或结果,然后再求出所有元素的异或结果,这样就得到消失的两个数字的异或结果。现在问题转换为如何将这两个数字分开,可以使用位运算求出这两个数字低位第一个不同的位置k,即异或结果中低位第一个出现的1,然后再根据数组中元素与所有元素中的每一个元素的k位置是1还是0将这两组元素分开即可。

vector<int> missingTwo(vector<int>& nums) 
{
   int n=nums.size();
   //xo得到的结果是消失的两个数字 0^a=a
   int xo=0;
   for(int i=1;i<=n+2;i++)
     xo^=i;
   for(int i=0;i<n;i++)
     xo^=nums[i];
   //现在需要将这两个数字分开
   int k=1;
   //直到找到xo为1的那一位 即两数第一个不同的那一位
   while((k&xo)==0)
     k<<=1;
   //将k位为1的分到res1
   int res1=0;
   //将k位为0的分到res2
   int res2=0;
   for(int i=1;i<=n+2;i++)
   {
      if(k&i)
        res1^=i;
      else
        res2^=i;
   }
   for(int i=0;i<n;i++)
   {
      if(k&nums[i])
        res1^=nums[i];
      else
        res2^=nums[i];
   }
   return {res1,res2};
}

总结:0^a=a,注意这一点,即异或结果的初始化为0。

vector<int> missingTwo(vector<int>& nums) 
{
   int n=nums.size();
   //xo得到的结果是消失的两个数字 0^a=a
   int xo=0;
   for(int i=1;i<=n+2;i++)
     xo^=i;
   for(int i=0;i<n;i++)
     xo^=nums[i];
   //现在需要将这两个数字分开
   int k=xo&(-xo);
   //将k位为1的分到res1
   int res1=0;
   //将k位为0的分到res2
   int res2=0;
   for(int i=1;i<=n+2;i++)
   {
      if(k&i)
        res1^=i;
      else
        res2^=i;
   }
   for(int i=0;i<n;i++)
   {
      if(k&nums[i])
        res1^=nums[i];
      else
        res2^=nums[i];
   }
   return {res1,res2};
}

总结:可以使用xo&(-xo)得到xo低位的第一个1,因为负数是以补码的形式存储的,即-xo=~xo+1,比如xo=1100,那么~xo=0011,-xo=0100。文章来源地址https://www.toymoban.com/news/detail-517746.html

到了这里,关于【程序员面试金典】面试题 17.19. 消失的两个数字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【程序员面试金典】面试题 17.26. 稀疏相似度

    描述:两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。例如,{1, 5, 3} 和 {1, 7, 2, 3} 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。给定一系列的长篇文档,每个文档元素各不相同,并与一个

    2024年02月12日
    浏览(26)
  • 【程序员面试金典】面试题 17.23. 最大黑方阵

    描述:给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出 4 条边皆为黑色像素的最大子方阵。 返回一个数组 [r, c, size] ,其中 r, c 分别代表子方阵左上角的行号和列号,size 是子方阵的边长。若有多个满足条件的子方阵,返回 r 最小的,若 r 相同,返回 c 最小

    2024年02月12日
    浏览(27)
  • 【程序员面试金典】面试题 17.14. 最小K个数

    描述:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例: 提示: 0 = len(arr) = 100000 0 = k = min(100000, len(arr)) 思路:最直观的想法是,排序。 扩展:最大堆。最小的k个数,那么就可以维持一个大小为k的最大堆,先填充k个数到最大堆中,然后再依次遍

    2024年02月11日
    浏览(42)
  • 【程序员面试金典】面试题 17.21. 直方图的水量

    描述:给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。 感谢 Marcos 贡献此图。 示例: 思路:最直观的想

    2024年02月11日
    浏览(31)
  • 《程序员面试金典(第6版)面试题 16.10. 生存人数(前缀和思想)

    给定 N 个人的出生年份和死亡年份,第 i 个人的出生年份为 birth[i],死亡年份为 death[i],实现一个方法以计算生存人数最多的年份。 你可以假设所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之间。如果一个人在某一年的任意时期处于生存状态,那么他应该被纳入那一年的

    2024年02月02日
    浏览(35)
  • 《程序员面试金典(第6版)》 面试题 08.11. 硬币(动态规划,组合问题,C++)

    硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额: 5=5 5=1+1+1+1+1 示例2: 输入: n = 10 输出:4 解释: 有四种方式可以凑成总金额: 1

    2023年04月08日
    浏览(38)
  • 五年内程序员这个职业将消失?

    作者 :明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐 : (1)《为什么很多人工作 3 年 却只有 1 年经验?》 (2)《一

    2024年03月14日
    浏览(48)
  • 读程序员的README笔记17_构建可演进的架构(下)

    1.3.3.1. 开发人员可以只专注于和自己相关的字段,因为它们会继承其他字段的默认值 1.3.3.2. 默认值可使大型API在感觉上很小巧 1.4.1.1. OpenAPI通常用于RESTful服务 1.4.1.2. non-REST服务则使用Protocol Buffers、Thrift或类似的接口定义语言(interface definition language,IDL) 1.4.1.3. 接口定义工

    2024年02月04日
    浏览(42)
  • 【现象】手写100%代码的19年老程序员,拒绝使用Copilot、GPT-4工具后,惨遭淘汰、解雇

            近日,Twitter 上一名技术人分享了他监督的一个事件,即拥有 19 年编码经验、会 100% 手写代码的程序员最终败给一位仅有 4 年经验、却善用 Copilot、GPT-4 的后辈,后因不愿拒绝使用辅助代码工具,只想写可控的代码,惨遭面试淘汰,而后者轻松拿到了全职 Offer。   事

    2024年02月10日
    浏览(40)
  • 程序员面试逻辑题

    答案: 这个题有点像数学归纳法,就是假设有 A A A 和 B B B 两个人是黑色的帽子,这样的话第一次开灯, A A A 看到 B B B 是黑色的,其他人都是白色的,那么 A A A 会觉得 B B B 是那个黑色的,同理 B B B 也是这么想的。一次关灯之后 A A A 和 B B B 都没有打耳光, A A A 反应过来

    2024年02月09日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包