[每日练习]一个数组中有一个数字只出现一次,其他数字都出现了偶数次。请找出一个只出现一次的数字



#include <stdio.h>
/*
原题描述:
一个数组中有一个数字只出现一次,其他数字都出现了偶数次。请找出一个只出现一次的数字?
解题思路:
将数组中所有的元素异或,最终的元素就是只出现一次的数字
*/
static int FindOneNum(int arr[], int length) 
{
 int i, num=0;
 for(i=0; i<length; i++)
  num ^= arr[i];
 return num;
}


/*
原题描述:
一个数组中有二个数字只出现一次,其他数字都出现了偶数次。请找出二个只出现一次的数字?
解题思路:
将数组中所有的元素异或,最终的元素就是那两个只出现一次的元素的异或。
因为那两个元素不相等,所以异或的结果必然不为0。
假设结果的某个bit为1,那必然是原来的两个数的这个位,一个为1,一个为0。
利用这个特性,将原来的数组分为两组,分别求解就可以了
*/

static int FindFirstSetBit(int num)
{
 int idx=31;
 while(idx>=0 && ((num >> idx) & 0x1)==0x0)
  idx--;
 return idx;
}

static int IsSet(int num, int n)
{
 if((num>>n) & 0x1)
  return 1;
 return 0;
}

static void FindTwoNum(int arr[], int length) 
{
 int i, num1=0, num2=0;
 int twonum, n;

 twonum = FindOneNum(arr, length);
 n = FindFirstSetBit(twonum);

 for(i=0; i<length; i++)
 {
  if(IsSet(arr[i], n))
   num1 ^= arr[i];
  else
   num2 ^= arr[i];
 }
 printf("num1=%d, num2=%d\n", num1, num2);
}

int main()
{
    int arr[]={1,1,2,2,3,3,5,5,6,7,7,10,8,8,9,9};
    int length = sizeof(arr)/sizeof(int);

    //printf("%d",FindOneNum(arr, length));
 
    FindTwoNum(arr, length);
    return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值