268. Missing Number
来源:互联网 发布:yy协议软件手机版 编辑:程序博客网 时间:2024/06/05 18:01
题目
268. Missing Number
解题思路
与之前那道题有些相似,也是遍历并让数字归位,因为只有一位数字丢失,假设数组长度为n,数组中的数字在[0,n]之间,
如果丢失的数字x范围是0≤x≤n-1,则数组最大的数字n必然无处归位(数组下标最大为n-1),则把n所在位置的数字设为-1,遍历结束后-1所在位置就是没有归位的数字,也就是丢失的数字;
如果丢失数字是n是话,那么数组所有数字都归位并且没有-1出现。
举个栗子:
用missindex来标注丢失数字的位置,初始化为-1
假设 4 2 5 0 1
1: 第一个数字为4位置不对,与第5个数字1交换位置
1 2 5 0 4 missindex = -1
2: 第一个数字为1位置不对,与第2个数字2交换位置
2 1 5 0 4 missindex = -1
3: 第一个数字为2位置不对,与第3个数字5交换位置
5 1 2 0 4 missindex = -1
4: 第一个数字为5位置不对,没有第6个位置,所以把5设为-1
-1 1 2 0 4 missindex = 0
5: 第一个数字为-1,跳过,继续遍历,第1,2个数字位置正确,也跳过,第3个数字0位置错误,与第一个数字-1交换位置
0 1 2 -1 4 missindex = 3
6:第3个数字是-1,跳过,继续遍历,后面数字位置正确,遍历结束时missindex = 3,因此丢失的数字是3
具体代码
class Solution {public: void swap(vector<int>& nums, int a, int b) { int t = nums[a]; nums[a] = nums[b]; nums[b] = t; } int missingNumber(vector<int>& nums) { int missindex = -1; for (int i = 0; i < nums.size(); i++) { while (nums[i] != -1 && nums[i] != i && nums[i] != nums.size()) { swap(nums, i, nums[i]); } if (nums[i] == nums.size()) { nums[i] = -1; missindex = i; } if (nums[i] == -1) missindex = i; } return missindex == -1 ? nums.size() : missindex; }};
PS
说来惭愧……又看见discuss的dalao神解法……对不起我的智商拉低了leetcode题目的easy率
dalao代码如下:
public int missingNumber(int[] nums) { int xor = 0, i = 0; for (i = 0; i < nums.length; i++) { xor = xor ^ i ^ nums[i]; } return xor ^ i;}
有个很必要知道的定理就是:a^b^b =a, 所以最后出来的那个数字肯定只出现过一次,也就是那个丢失的数字啦~
位运算,学的棒,走遍天下都不怕!
- [leetcode] 268.Missing Number
- 【leetcode】268. Missing Number
- [leetcode] 268. Missing Number
- 268. Missing Number
- Leetcode 268. Missing Number
- 268. Missing Number LeetCode
- LeetCode 268. Missing Number
- 268. Missing Number
- 【LeetCode】268. Missing Number
- 268. Missing Number
- [LeetCode]268. Missing Number
- 268. Missing Number
- LeetCode *** 268. Missing Number
- 268. Missing Number
- 【leetcode】268. Missing Number
- leetcode-268. Missing Number
- LeetCode-268.Missing Number
- LeetCode 268. Missing Number
- Visiting Peking University 2017ACM-ICPC亚洲区(北京赛区)网络赛题目1
- 多自由度平衡稳定性
- Hibernate外键一对一单向和双向关联的理解
- ubuntu server 16.04.2 编译使用mod_shout
- HTTPS 原理及安全加密方案
- 268. Missing Number
- 如果不引用第三个变量,就能直接交换两个变量的值?
- C语言 java 获取一维数组长度
- 验证码
- 编译安装bind
- MOOC清华《VC++面向对象与可视化程序设计》第1章:空白窗口的创建(Win32项目)
- [洛谷]P1080 国王游戏
- hdu 3371 Connect the cities (prim)
- 数据仓库