您的位置:首页 > 编程语言 > C语言/C++

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
, 所以最后出来的那个数字肯定只出现过一次,也就是那个丢失的数字啦~

位运算,学的棒,走遍天下都不怕!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ leetcode