剑指offer.数组中数字出现的次数

题目:

一个整型数组里除了两个数字之外,其他数字都出现了两次,请写出程序找出这两个只出现一次的数字。

思路:

我一开始想到的就是直接用哈希表,空间换时间,但这种方法通常是在时间复杂度比较高,且没办法再改良时间复杂度的情况下做的选择,我们这里还有别的方法可以选择。

首先我们考虑这个数字中如果只有一个数字只出现了一次,其他都是两次,那么怎么找到这个数字呢,其实异或运算就很好解决这种问题,异或完所有数字后就只剩一个没重复的数字。

所以我们是不是可以把这个思路运用到原始的问题里面去呢,最好的办法就是把这两个只出现一次的数字放到两个不同的数组里去,从而实现每个数字里头最后异或运算结果后分别得到一个数字,问题就再次简化成如何把这两个数分开,这个数组没有什么别的特点,无序,就只有数字上有特点,所以我们还是可以用这个异或的方法,当我们把整个数组里的数字进行异或运算后其实就是那两个数字进行异或运算的结果。结果肯定不为0,所以这个结果数字转化为2进制结果后就会一定存在一位为1,我们直接取第一个为1的位置,记为第n位。所以我们以第n位是不是1位标准把原数组中的数字分为两个数组,再分别进行异或运算就好了。

代码实现:

int* singleNumbers(int* nums, int numsSize, int* returnSize){
    int ret=0,i=0,num1=0,num2=0,pos=0;
    int* arr=(int*)malloc(2 * sizeof(int));
for(i=0;i<numsSize;i++){
    ret^=num[i];
}
for(i=0;i<32;i++){
    if((ret>>i)&1==1){
       pos=i;
       break;
  }
}
for(i=0;i<numsSize;i++){
    if((nums[i]>>pos)&1==1){
    num1^=num[i];
  }
    else{
    num2^=num[i];
}
}
        arr[0]=num1;
        arr[1]=num2;
        *returnSize=2;
        return arr;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值