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

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

示例 1:

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

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

nums.length <= 30000

法一:位运算

class Solution {
public:
//数组完全可能是乱序
vector<int> missingTwo(vector<int>& nums) {
vector<int> res;
//法一:异或法 想办法将两个数分开,有点类似一sigleNumber的想法,有两个数落单;分出两个数组来异或
int N = nums.size()+2;
int tdiff = 0;
for(int i=1;i<=N;i++){
tdiff ^= i;
}
for(int i=0;i<nums.size();i++){
tdiff ^= nums[i];
}
//diff此时是两个数的异或值,两个数不想等,利用mask标志分开两个数。
int mask = 1;
while(!(mask & tdiff)){
mask = mask << 1;
}
//mask现在就是第一个不同的xxxx1xxxx
//两部分数用mask分开
int one = 0;
for(int i=0;i<nums.size();i++){
if(mask & nums[i]) one ^= nums[i];
}
for(int i=1;i<=N;i++){
if(mask & i) one ^= i;
}
res.push_back(one);
res.push_back(one^tdiff);
return res;
}
};

法二:分组求和

class Solution {
public:
vector<int> missingTwo(vector<int>& nums) {
vector<int> res;
//法二 分组求和
int N = nums.size()+2;
int sumN = 0,sumNum = 0,sumNumLess=0,sumNLess=0;
for(auto num : nums)
sumNum += num;
for(int i=1;i<=N;i++)
sumN += i;
//diff是两个数的和
int sumTwo = sumN - sumNum;
//求两个数和的一半,那么两个缺失得数一个大于diff,一个小于diff。
int diff = (sumTwo)/2;
//针对 N 和sum两个数组,小于等diff的分别分为一组;大于diff的分别分为一组;那么两个组的差值即为缺失的一大一小
for(auto num : nums){
if(num<=diff){
sumNumLess+=num;
}
}
for(int i=1;i<=N;i++){
if(i<=diff){
sumNLess+=i;
}
}
res.push_back(sumNLess-sumNumLess);
res.push_back(sumTwo-(sumNLess-sumNumLess));
return res;
}
};

消失的两个数字(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. 多测试_linux_003_肖sir

    一.linux 介绍os 操作系统:windows,dos,android ,ios,unix ,linux linux系统:是一个免费,开源的操作系统,能多cpu,多用户,多线程的操作系统,比win ...

  2. 发布MeteoInfo 1.2.8

    增加了对SYNOP数据的支持(功能从C#版移植过来).数据可以从这里下载:http://weather.cod.edu/digatmos/syn/SYNOP数据搞气象的人应该多少知道些,类似MICAP ...

  3. go视频提取音频

    package main import ( "bytes" "fmt" "log" "os" "os/exec ...

  4. 第十二章 LNMP架构之分离数据库

    一.课程回顾 1.搭建LNMP环境 1.配置官方源2.yum安装依赖3.yum安装nginx4.配置nginx5.创建用户6.启动并加入开机自启​7.上传安装包8.解压安装包9.卸载旧版本PHP10. ...

  5. 一文快速入门分库分表中间件 Sharding-JDBC (必修课)

    书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...

  6. CTF相关

    https://blog.csdn.net/zxl2016/article/details/96482763

  7. LruCache缓存bitmap(一)

    Lrucache是把图片缓存到内置sd卡,设置缓存容量为系统分配容量的八分之一,单位byte,超过缓存容量gc会自动回收不长使用的缓存.觉得lrucache就先map一样,放入键值对就行了,比较方便, ...

  8. C. Vladik and Memorable Trip 解析(思維、DP)

    Codeforce 811 C. Vladik and Memorable Trip 解析(思維.DP) 今天我們來看看CF811C 題目連結 題目 給你一個數列,一個區段的數列的值是區段內所有相異數 ...

  9. 硬核!15张图解Redis为什么这么快

    作为一名服务端工程师,工作中你肯定和 Redis 打过交道.Redis 为什么快,这点想必你也知道,至少为了面试也做过准备.很多人知道 Redis 快仅仅因为它是基于内存实现的,对于其它原因倒是模棱两 ...

  10. Elasticsearch启动报错:future versions of Elasticsearch will require Java 11

    1 future versions of Elasticsearch will require Java 11; your Java version from [C 2 :\Program Files ...