给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
输入: [4,1,2,1,2]
输出: 4
一种异或方法
1:a ^ b ^ c <=> a ^ c ^ b
2:0 ^ n => n
3: n ^ n => 0
进行异或计算前会把数值都转换为二进制:
1.(例如)5和3转为二进制分别为:0101 、0011
0101
xor 0011
--------
0110
2.再把结果 0110 转换为十进制的:6
代码:
int singleNumber(int* nums, int numsSize) {
int number=0,i=0;
while(i<numsSize)
{
number^=nums[i];
i++;
}
return number;
}
第二种排序再判断:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
base -- 指向要排序的数组的第一个元素的指针。
nitems -- 由 base 指向的数组中元素的个数。
size -- 数组中每个元素的大小,以字节为单位。
compar -- 用来比较两个元素的函数。
该函数不返回任何值。
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int singleNumber(int* nums, int numsSize) {
qsort(nums, numsSize, sizeof(nums[0]), cmpfunc);
if(numsSize==1||nums[numsSize-1]!=nums[numsSize-2])return nums[numsSize-1];
for(int i=0;i<numsSize;i++)
{
if(nums[i]!=nums[i+1])return nums[i];
i++;
}
return 0;
}