【leetcode】268. Missing Number

题目:

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

For example,
Given nums = [0, 1, 3] return 2.

Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?

翻译:

数组nums中的数字的取值是0-n,且都不重复,只是从中去掉了一个数字,本题的任务是要找出这个缺失的数。且最好只能用一个额外的空间。

思路:

本题的思路有很多种,其他好想的我就不说了,我就说说用位的异或操作来实现的做法,这个做法我觉得网上大部分博客说的不太清楚。首先我们知道:

1.A^0=A

2.异或操作是满足交换律,结合律。

首先我们令result=0^1^...^n,然后我们对整个数组进行遍历,令result=result^nums[i],那么根据结合律和交换律,我们相当于进行了这样的操作(假设确实的数是i):(0^0)^(1^1)...((i-1)^(i-1))^(i)^((i+1)^(i+1))...(n^n),那么最后的结果就是缺失的数i。

代码:

class Solution {
public:
	int missingNumber(vector<int>& nums) {
		int result = nums.size();
		int i=0;

		for(int num=0;num<nums.size();num++){
			result ^= nums[num];
			result ^= i;
			i++;
		}

		return result;
	}
};
结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值