268. 缺失数字

268. 缺失数字

难度:简单
题目描述
在这里插入图片描述
解题思路
最简单的可以用桶计数或者排序,然后找到没出现过的数字。但是题目要求线性时间复杂度,所以不能排序,又只使用额外常数空间,也不能用桶计数。

因为这个题里数据范围是确定的,而且只缺失一个正整数,所以可以先计算0~n的和,然后依次减去数组里的元素,剩下来的就是没出现过的。考虑到如果数组范围很大那直接算和可能会溢出,所以边加边减,一样能达到效果。

1、计算累加和

public int missingNumber(int[] nums) {
        int sum = 0;
        //直接相加求和可能会溢出,所以边加边减
        for (int i = 0; i < nums.length; i++) {
            sum += i;
            sum -= nums[i];
        }
        sum += nums.length;
        return sum;
    }

在这里插入图片描述

2、位运算

和重复出现的数字那道题有点像,利用异或的性质,同0异1,而且0异或别的数字就等于他本身。
1^ 1 ^ 2^ 2^ 3 = 3
全部要注意一个细节就是数字的范围,数字范围0~9,因为缺了一味,所以数组长度是9,最大下标只能到8,所以要额外把9再做一次异或

public int missingNumber(int[] nums) {
        int re = nums.length;
        //异或,最后剩下来的就是没出现过的
        for (int i = 0; i < nums.length; i++) {
            re ^= nums[i];
            re ^= i;
        }
        return re;
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值