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

> Problem:

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

# 思路

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

# 解题方法

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

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

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

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

# 复杂度

时间复杂度:

> O(n)

AC代码:

 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~ 

相关推荐

  1. -260. 出现数字 III

    2024-01-28 20:36:04       25 阅读
  2. 每日OJ题_运算⑥_137. 出现数字 II

    2024-01-28 20:36:04       42 阅读
  3. -137. 出现数字 II

    2024-01-28 20:36:04       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-28 20:36:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-28 20:36:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-28 20:36:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-28 20:36:04       18 阅读

热门阅读

  1. 代码随想录算法训练营29期Day31|LeetCode 455,376,53

    2024-01-28 20:36:04       39 阅读
  2. 【 C++私房菜】模板的入门与进阶

    2024-01-28 20:36:04       32 阅读
  3. FIND_IN_SET的使用:mysql表数据多角色、多用户查询

    2024-01-28 20:36:04       36 阅读
  4. 代码随想录算法训练营29期Day32|LeetCode 122,55,45

    2024-01-28 20:36:04       38 阅读
  5. C# 使用DateTime模块判断当前时间处在哪个时段

    2024-01-28 20:36:04       27 阅读
  6. Scikit-Learn 高级教程——高级模型

    2024-01-28 20:36:04       25 阅读
  7. Redis:Could not get a resource from the pool

    2024-01-28 20:36:04       30 阅读
  8. Linux ping命令详解

    2024-01-28 20:36:04       30 阅读
  9. Python爬虫的简单实践

    2024-01-28 20:36:04       34 阅读