数组中数字出现的次数——剑指offer 56-I

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
在这里插入图片描述

如果我们可以把所有数字分成两组,使得:

  1. 两个只出现一次的数字在不同的组中;

  2. 相同的数字会被分到相同的组中。

那么对两个组分别进行异或操作,即可得到答案的两个数字。这是解决这个问题的关键。

那么如何实现这样的分组呢?

在这里插入图片描述

var singleNumbers = function(nums) {
    var tmp = 0;
    for(var i=0;i<nums.length;i++){
      tmp=tmp^nums[i];
    }
    var mark = 1;             // mark就是分组凭据
    while((mark & tmp) === 0) { // 一直到找到第一个1为止 
        mark <<= 1;
    }
    var arr1 = 0;
    var arr2 = 0;
    for(var i=0;i<nums.length;i++){
        if((nums[i]&mark)==0){
          arr1=arr1^nums[i];
        }else{
          arr2=arr2^nums[i];
        }
    }
  return [arr1,arr2];
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值