每日一题——丢失的数字

简介: 每日一题——丢失的数字

丢失的数字

题目链接

注:这一题的解法建立在位运算——异或^的基础之上,如果位运算和异或操作符不太了解,建议先看看:

位运算详解

只出现一次的数字


思路

同样,这题要求时间复杂度为O(n),空间复杂度为O(1)

可能有小伙伴做了找到消失的数字后,也觉得这题也可以用同样的方法,通过改变对应下标的元素来找到丢失的数字。但是我们应该清楚两题的不同点:

  1. 《找到消失的数字》数组的长度为n,数据范围也只有n个数;《丢失的数字》数组长度为n,但数据范围却有n + 1个数
  2. 由于上面的不同,《找到消失的数字》可以通过数据绝对值-1的方法来确定一个唯一的下标进行修改,从而达到目标;而《丢失的数字》无法通过数组数据来确定一个唯一的下标
  3. 《找到消失的数字》数组中的元素可以重复;《丢失的数字》数组中的元素独一无二

这一题,我们同样利用异或的特性解决问题

异或的特性:

异或是支持交换律的:a ^ b ^ c = b ^ a ^ c

a ^ a = 0相同的数异或为0

0 ^ a = a一个数和0异或得到的还是本身

由于数组元素范围都在[0,n]但少了[0,n]的一个数,那么我们就可以将[0,n]的每一个数异或到一起,再将这个结果和数组中的每个元素异或到一起,那么最后得到的就是这个丢失的数字。

实现代码

int missingNumber(int* nums, int numsSize){
    int ret = 0;  //设置返回值
    //将数组的每个元素异或到一起
    for(int i = 0; i < numsSize; i++)
        ret ^= nums[i];
    //将[0,n]的每个数据异或到一起
    for(int i = 0; i <= numsSize; i++)
        ret ^= i;
    return ret;
}

可能又有小伙伴回想为什么找到消失的数字不能用异或法,这是因为**《找到消失的数字》数组中的数据可以重复,这就导致了消失的数字就不止一个,而用异或只能确定一个数字,**因此异或法就行不通了。

相关文章
|
7月前
【Leetcode -263.丑数 -268.丢失的数字】
【Leetcode -263.丑数 -268.丢失的数字】
12 0
|
1天前
|
算法
【力扣】268.丢失的数字
【力扣】268.丢失的数字
|
1天前
leetcode:268. 丢失的数字(异或运算)
leetcode:268. 丢失的数字(异或运算)
14 0
|
11月前
|
算法 C语言
【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
|
11月前
|
算法 前端开发 索引
前端算法-丢失的数字
前端算法-丢失的数字
力扣刷题记录——258. 各位相加、263.丑数、268.丢失的数字
力扣刷题记录——258. 各位相加、263.丑数、268.丢失的数字
力扣刷题记录——258. 各位相加、263.丑数、268.丢失的数字
|
Python
LeetCode 268. 丢失的数字
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
77 0
|
索引
力扣刷题记录——367. 有效的完全平方数、383. 赎金信、387. 字符串中的第一个唯一字符、389. 找不同
力扣刷题记录——367. 有效的完全平方数、383. 赎金信、387. 字符串中的第一个唯一字符、389. 找不同
力扣刷题记录——367. 有效的完全平方数、383. 赎金信、387. 字符串中的第一个唯一字符、389. 找不同
|
索引
力扣刷题记录——434. 字符串中的单词数、448. 找到所有数组中消失的数字、455. 分发饼干
力扣刷题记录——434. 字符串中的单词数、448. 找到所有数组中消失的数字、455. 分发饼干
力扣刷题记录——434. 字符串中的单词数、448. 找到所有数组中消失的数字、455. 分发饼干
|
C语言
每日一题断更一天(补上):1063统计字符
题目描述: 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 输入: 无
50 0