缺失数字 【leetCode 使用异或求解找一个缺省值问题】

                                                       缺失数字

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

示例 1:

输入: [3,0,1]
输出: 2

示例 2:

输入: [9,6,4,2,3,5,7,0,1]
输出: 8

说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

求解:对于这类问题的变种也很多,比如有一个长度为10000的数列, 存放着1-10000的自然数, 连续, 不重复, 但数列并不是有序的现在随机选取1-10000之间的某个自然数, 加入到这个数列中, 要求用简便的算法找到这个后来加入的数。这个问题和本题的解法相同,就是使用异或。

    我们先来了解一下异或的特点:

         1.两个相同的数按位异或结果为0

         2.任何数和零按位异或结果为这个数本身

    所以有1^1=0, 1^1^2=2, 1^1^2^2^3=3,这样我们就可以从0开始遍历,我们异或0-n,然后再异或数组里面的值。

public class Test07 {
    public static void main(String[] args) {
        int[] a={9,6,4,2,3,5,7,0,1};
        System.out.println(missingNumber(a));
    }

    public static int missingNumber(int[] nums) {
        int n=0;
        for (int i = 0; i < nums.length ; i++) {
            n=n^i;
            n=n^nums[i];
        }
        n=n^nums.length;  //这一步不要忘记,数组是从0-n ,总共是n+1个数
        return n;
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值