前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[260. 只出现一次的数字 III](C语言题解)(位运算)(力扣)

[260. 只出现一次的数字 III](C语言题解)(位运算)(力扣)

作者头像
用户11039529
发布2024-03-25 15:28:15
730
发布2024-03-25 15:28:15
举报
文章被收录于专栏:算法学习日常算法学习日常

> Problem:

[260. 只出现一次的数字 III](260. 只出现一次的数字 III - 力扣(LeetCode))

# 思路

> 想到数组中只有一个数只出现了一次解法:**所有数异或,最后答案就是那个只出现一次的数**,该题只需将两个不同的数放在不同的分组,再分别进行 只有一个数出现一次 的解法

# 解题方法

> 先将所有数异或,得出的数c的二进制为1的位置就是两个只出现一次的两个数二进制不同的位置

>找出最右边的两个数二进制位不同位置(c的二进制中最右边为1的位置)

>根据该位置等于1和等于0进行分组

>最后两个组所有元素分别异或得到的两个数就是两个只出现一次的数

# 复杂度

时间复杂度:

> O(n)

AC代码:

代码语言:javascript
复制
 int* singleNumber(int* a, int n, int* returnSize) 
 {
     if (n == 2)
     {
         *returnSize = 2;
         return a;
     }
     int c = 0;
     //异或
     for (int i = 0; i < n; i++)
     {
         c ^= a[i];
     }

     //求最右边的1出现在哪一位
     int ret = 0;
     for (int i = 0; i < 32/*一个数最多32位*/; i++)
     {
         if (((c >> i) & 1) == 1)
         {
             //如果c右移i位后最后一位为1,说明第i位为1(两个只出现一次的数这个位置上的数不同),则退出循环,根据第i位的取值分组(两个数会被分到不同的组),
             //分别异或就可分别找出组内只出现一次的数(与整组内只有一个数只出现一次的方法相同)
             ret = i;
             break;
         }
     }
     int* ans = (int*)calloc(2,sizeof(int));
     //分组分别求两组内只出现一次的数(分组规则:第ret位为1的分一组,为0的分一组)
     for (int i = 0; i < n; i++)
     {
         if (((a[i] >> ret) & 1) == 1)
         {
             ans[0] ^= a[i];
         }
         else
         {
             ans[1] ^= a[i];
         }
     }
     *returnSize = 2;
     return ans;
 }

最后祝大家题题AC,天天只想WA~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • > Problem:
  • # 思路
  • # 解题方法
  • # 复杂度
    • 时间复杂度:
    • AC代码:
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档