268. Missing Number
2017-09-23 21:16
375 查看
题目
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; 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; }
有个很必要知道的定理就是:[b]a^b^b =a, 所以最后出来的那个数字肯定只出现过一次,也就是那个丢失的数字啦~
位运算,学的棒,走遍天下都不怕!
相关文章推荐
- Leetcode 268. Missing Number
- 2018.03.15 leetcode 打卡 #268. Missing Number
- 268. Missing Number 难度:medium
- 268. Missing Number
- 268. Missing Number
- [LeetCode]268. Missing Number
- 268. Missing Number
- LeetCode *** 268. Missing Number
- LeetCode 268. Missing Number(缺失数字)
- 268. Missing Number
- 268. Missing Number
- Leetcode 268. Missing Number (Medium) (cpp)
- 268. Missing Number
- 268. Missing Number
- 【Leetcode】268. Missing Number
- [leetcode]-268. Missing Number(C语言)
- 2018.03.15 leetcode 打卡 #268. Missing Number
- 268. Missing Number
- [leetcode]: 268. Missing Number
- 【leetcode】268. Missing Number