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

来源:互联网 发布:药品 网络 终端销售 编辑:程序博客网 时间:2024/04/30 15:52


#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; 
}

0 0
原创粉丝点击