leetcode-只出现一次的数字

本文介绍了一种在整数数组中查找唯一出现一次元素的方法,使用异或运算和排序判断两种算法实现。异或方法利用了数学特性,适用于大数据集且效率高;排序判断法则直观但对数据排序有依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
输入: [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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值