程序员面试金典 - 面试题 17.19. 消失的两个数字(数学/位运算)
1. 题目
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。
你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?
以任意顺序返回这两个数字均可。
示例 1:
输入: [1]
输出: [2,3]示例 2:
输入: [2,3]
输出: [1,4]提示:
nums.length <= 30000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/missing-two-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 数学公式
12+22+32+42+....+n2=n∗(n+1)∗(2n+1)/61^2+2^2+3^2+4^2+....+n^2 = n*(n+1)*(2n+1)/612+22+32+42+....+n2=n∗(n+1)∗(2n+1)/6
1+2+...+n=n∗(1+n)/21+2+...+n = n*(1+n)/21+2+...+n=n∗(1+n)/2
class Solution {public:vector<int> missingTwo(vector<int>& nums) {int n = nums.size()+2, a, b;long sum = 0, squareSum = 0;for(int i = 0; i < nums.size(); ++i){sum += nums[i];squareSum += nums[i]*nums[i];}squareSum = long(n)*(n+1)*(2*n+1)/6 - squareSum;sum = n*(n+1)/2 - sum;for(a = 1; a <= n; ++a){if(2*a*(sum-a) == sum*sum - squareSum)break;}b = sum-a;return {a,b};}
};
72 ms 22.5 MB
2.2 常规解法
class Solution {public:vector<int> missingTwo(vector<int>& nums) {sort(nums.begin(), nums.end());vector<int> ans;int i, j;for(i = 1, j = 0; i <= nums.size()+2 && j < nums.size(); ++i){if(nums[j] != i)ans.push_back(i);elsej++;if(ans.size()==2)return ans;}if(ans.size()==1)ans.push_back(i);else if(ans.size()==0){ans.push_back(i);ans.push_back(i+1);}return ans;}
};
116 ms 22.4 MB
2.3 位运算
- 0 异或所有数,以及1-n的所有数,只出现1次的两个数的异或值得到了
- 把上面异或值不为0的二进制位找到
- 用这个位把 1到n 和数组里的数(2n-2 个),按照上面找出的二进制位,分成2组
- 即得到出现1次的两个数
class Solution {public:vector<int> missingTwo(vector<int>& nums) {int XOR = 0, a = 0, b = 0, i;for(auto& n : nums) XOR ^= n;for(i = 1; i <= nums.size()+2; ++i) XOR ^= i;for(i = 0; i < 32; ++i)if(XOR&(1<<i))//a、b二进制不同的位break;// i为 a,b 不相同的二进制位for(auto& n : nums){if((n>>i)&1)//分组a ^= n;elseb ^= n;}for(int j = 1; j <= nums.size()+2; ++j){if((j>>i)&1)a ^= j;elseb ^= j;}return {a,b};}
};
80 ms 22.3 MB
程序员面试金典 - 面试题 17.19. 消失的两个数字(数学/位运算)相关推荐
- 程序员面试金典 - 面试题 17.04. 消失的数字(数学/位运算)
1. 题目 数组 nums 包含从0到n的所有整数,但其中缺了一个. 请编写代码找出那个缺失的整数.你有办法在O(n)时间内完成吗? 注意:本题相对书上原题稍作改动 示例 1: 输入:[3,0,1] ...
- 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)
文章目录 1. 题目 2. 解题 2.1 超时解 2.2 二分查找 1. 题目 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一 ...
- 程序员面试金典 - 面试题 17.07. 婴儿名字
题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 每年,政府都会公布一万个最常见的婴 ...
- 程序员面试金典 - 面试题 17.22. 单词转换(BFS)
1. 题目 给定字典中的两个词,长度相等. 写一个方法,把一个词转换成另一个词, 但是一次只能改变一个字符. 每一步得到的新词都必须能在字典中找到. 编写一个程序,返回一个可能的转换序列.如有多个可能 ...
- 程序员面试金典 - 面试题 17.06. 2出现的次数(找递推规律)
1. 题目 编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数. 示例: 输入: 25 输出: 9 解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 ...
- 程序员面试金典 - 面试题 17.23. 最大黑方阵(DP)
1. 题目 给定一个方阵,其中每个单元(像素)非黑即白. 设计一个算法,找出 4 条边皆为黑色像素的最大子方阵. 返回一个数组 [r, c, size] ,其中 r, c 分别代表子方阵左上角的行号和 ...
- 程序员面试金典 - 面试题 17.15. 最长单词(排序+递归)
1. 题目 给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成. 若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串. ...
- 程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)
1. 题目 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量. 有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来. 给定两个 ...
- [Leetcode][程序员面试金典][面试题17.13][JAVA][恢复空格][动态规划][Trie][字符串哈希]
[问题描述][中等] [解答思路] 1. 动态规划 动态规划流程 第 1 步:设计状态 dp[i] 表示字符串的前 i 个字符的最少未匹配数. 第 2 步:状态转移方程 假设当前我们已经考虑完了前 i ...
最新文章
- 前端一HTML:二十二元素显示方式案例
- mysql命令巧记_MYSQL常用命令大全(三)【值得收藏】
- Mysql剖析单条查询三种方法
- 设计模式之依赖倒转原则
- NSObject协议中方法:description 和 debugDescription
- MySQL入门之备份与恢复
- CTS 2019 Pearl
- linux运维中的中间件,linux中间件Nginx的安装过程
- mysql连接报java.math.BigInteger cannot be cast to java.lang.Long异常
- cocos2d-x游戏引擎核心(3.x)----事件分发机制之事件从(android,ios,desktop)系统传到cocos2dx的过程浅析...
- STORM的DRPC通讯
- crc可以检出奇数个错误_计算机网络学习笔记 3.3 差错控制
- python如何使用ppip安装xlwt_如何安装python xlwt
- linux教程 课件ppt,Linux操作系统实用教程全集 教学课件 中文PPT版
- 2022-10-03笔记(内网横向)
- 回归技术——我看中国软件的发展方向
- 计算机or笔记本,笔记本or台式机 这几款戴尔主机性能上没得挑
- 微信小程序--分享并设置分享链接的有效时间
- 军队文职(数学2+物理)——高等数学 1、函数
- 【跨境电商】5个最佳WordPress插件推荐