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

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

示例 1:

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

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

nums.length <= 30000

法一:位运算

  1. class Solution {
  2. public:
  3. //数组完全可能是乱序
  4. vector<int> missingTwo(vector<int>& nums) {
  5. vector<int> res;
  6. //法一:异或法 想办法将两个数分开,有点类似一sigleNumber的想法,有两个数落单;分出两个数组来异或
  7. int N = nums.size()+2;
  8. int tdiff = 0;
  9. for(int i=1;i<=N;i++){
  10. tdiff ^= i;
  11. }
  12. for(int i=0;i<nums.size();i++){
  13. tdiff ^= nums[i];
  14. }
  15. //diff此时是两个数的异或值,两个数不想等,利用mask标志分开两个数。
  16. int mask = 1;
  17. while(!(mask & tdiff)){
  18. mask = mask << 1;
  19. }
  20. //mask现在就是第一个不同的xxxx1xxxx
  21. //两部分数用mask分开
  22. int one = 0;
  23. for(int i=0;i<nums.size();i++){
  24. if(mask & nums[i]) one ^= nums[i];
  25. }
  26. for(int i=1;i<=N;i++){
  27. if(mask & i) one ^= i;
  28. }
  29. res.push_back(one);
  30. res.push_back(one^tdiff);
  31. return res;
  32. }
  33. };

法二:分组求和

  1. class Solution {
  2. public:
  3. vector<int> missingTwo(vector<int>& nums) {
  4. vector<int> res;
  5. //法二 分组求和
  6. int N = nums.size()+2;
  7. int sumN = 0,sumNum = 0,sumNumLess=0,sumNLess=0;
  8. for(auto num : nums)
  9. sumNum += num;
  10. for(int i=1;i<=N;i++)
  11. sumN += i;
  12. //diff是两个数的和
  13. int sumTwo = sumN - sumNum;
  14. //求两个数和的一半,那么两个缺失得数一个大于diff,一个小于diff。
  15. int diff = (sumTwo)/2;
  16. //针对 N 和sum两个数组,小于等diff的分别分为一组;大于diff的分别分为一组;那么两个组的差值即为缺失的一大一小
  17. for(auto num : nums){
  18. if(num<=diff){
  19. sumNumLess+=num;
  20. }
  21. }
  22. for(int i=1;i<=N;i++){
  23. if(i<=diff){
  24. sumNLess+=i;
  25. }
  26. }
  27. res.push_back(sumNLess-sumNumLess);
  28. res.push_back(sumTwo-(sumNLess-sumNumLess));
  29. return res;
  30. }
  31. };

消失的两个数字(1-N缺两个数)的更多相关文章

  1. 《剑指offer》第五十七题(和为s的两个数字)

    // 面试题57(一):和为s的两个数字 // 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们 // 的和正好是s.如果有多对数字的和等于s,输出任意一对即可. #includ ...

  2. JavaScript求两个数字之间所有数字的和

    这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...

  3. [LeetCode] Add Two Numbers II 两个数字相加之二

    You are given two linked lists representing two non-negative numbers. The most significant digit com ...

  4. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  5. [LeetCode] Add Two Numbers 两个数字相加

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  6. 求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法

    今天面试,遇到面试官询求最大公约数.小学就学过的奥数题,居然忘了!只好回答分解质因数再求解! 回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:ht ...

  7. [CareerCup] 2.5 Add Two Numbers 两个数字相加

    2.5 You have two numbers represented by a linked list, where each node contains a single digit. The ...

  8. 控制input标签中只能输入数字以及小数点后两位

    js 代码如下: /* 控制input标签中只能输入数字 和小数点后两位 */ function checkNum(obj) { //检查是否是非数字值 if (isNaN(obj.value)) { ...

  9. java integer对象判断两个数字是否相等

    java integer对象判断两个数字是否相等,不一定对 问题发生的背景:javaweb的项目,起先,因为在java中实体类中的int类型在对象初始化之后会给int类型的数据默认赋值为0,这样在很多 ...

随机推荐

  1. 多测师讲解性能测试_面试题_001高级讲师肖sir

    什么叫做性能测试?1. 软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,所以一般来说性能测试介入的时机是在功能测试完成之后.另外,由定义中的及时性可知性能也是一种指标,可以 ...

  2. Markdown语法及使用方法完整手册

    欢迎使用 Markdown在线编辑器 MdEditor Markdown是一种轻量级的「标记语言」 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容 ...

  3. 详解command设计模式,解耦操作和回滚

    大家好,欢迎来到设计模式专题,我们的主旨是介绍一些有趣好玩的设计模式. 今天我们介绍的设计模式叫做命令模式(command),在这个模式下,我们可以实现do和undo的解耦,让使用方不用关心内部的实现 ...

  4. webpack5文档解析(上)

    webpack5 声明:所有的文章demo都在我的仓库里 webpack5 起步 概念 webpack是用于编译JavaScript模块. 一个文件依赖另一个文件,包括静态资源(图片/css等),都会 ...

  5. pytest文档57-计算单元测试代码覆盖率(pytest-cov)

    前言 我们在做测试的时候,经常遇到领导的灵魂拷问:你的测试用例覆盖率是多少,达到100%了么?你如何保证你的测试质量? 测试用例的覆盖率如何统计呢,如何知道开发的代码,我们都测到了,不会存在漏测的情况 ...

  6. 【图论】HDU 5961 传递

    题目内容 题目链接 我们称一个有向图G是传递的当且仅当对任意三个不同的顶点a,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c. 我们称图G是一个竞赛图,当且仅当它是一个有向图 ...

  7. go 协程阻塞

    func main() { wg.Add(2) go test1() go test2() wg.Wait() } func test1() { defer wg.Done() for i:=0;i& ...

  8. docker19.03限制容器使用的内存资源

    一,指定内存大小的参数: [root@localhost liuhongdi]# docker run -idt --name kafka2 --hostname kafka2 -m 200M --m ...

  9. 说明资源路径位置类型无法解析The type javax.servlet.http.HttpServletResponse cannot be resolved.

    导入dispatch项目后报错: 解决办法:在项目上单击鼠标右键>  Add Libraries  选择 Server Runtime,下一步  选中Apache Tomcat7 完成  切换标 ...

  10. 使用PyPdf2合并PDF文件(没有空白、报错)

    使用PyPdf2合并PDF文件(没有空白.报错) 对于合并之后pdf空白,或者出现 'latin-1' codec can't encode characters in position 8-11: ...