LeetCode —— 只出现一次的数字

只出现一次的数字 I

本题依靠异或运算符的特性,两个相同数据异或等于0,数字与0异或为本身即可解答。代码如下:

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for (auto e : nums)
        {
            ret ^= e;
        }
        return ret;
    }
};

只出现一次的数字 II

官方使用位运算题解代码如下:

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {
            int total = 0;
            for (int num: nums) {
                total += ((num >> i) & 1);
            }
            if (total % 3) {
                ans |= (1 << i);
            }
        }
        return ans;
    }
};

为什么可以这样实现呢?博主也是想了好久,现在解释原理:

  1. 若顺序表中的元素个数为奇数,那么一定有 2n 组出现 3 次的数和1个只出现一次的数组成,右移n位,由于出现 3 次的数是偶数个,那么与1进行与运算并相加后,必定为3的倍数 ,如果模3不等于0,只有一种可能:只出现一次的数为1使total不能被整除,说明只出现一次的数第 i 位为1,反之为0。
  2. 若顺序表中的元素个数为偶数,那么一定有2n + 1组出现三次的数和1个只出现一次的数组成,右移n位,由于出现 3 次的数是奇数个,那么与1进行与运算并相加后,必定为3的倍数 ,如果模 3 不等于 0 ,只有一种可能:只出现一次的数为1使total不能被整除,说明只出现一次的数第 i 位为1,反之为0。

只出现一次的数字 III

本人选择了一个较为好理解的答案, 题解大神(灵茶山艾府)使用位运算题解代码如下:

cpp 复制代码
class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        // 负数在计算机是补码的形式存在
        // 无符号取负数就是取反加一
        unsigned int x = 0;
        for (auto e : nums)
        {
            x ^= e;
        }
        int lowbit = x & -x;
        // 此方法可以算出最低比特位  
        vector<int> ans(2);
        for (auto f : nums)
        {
            ans[(f & lowbit) != 0] ^= f;
        }
        return ans;
    }
};

看完图之后是否理解得更加深刻了呢?个人觉得第二次遍历相当巧妙,下面看大佬给出的解释:

希望本篇文章对你有帮助,有问题请在评论区指正,感谢阅读。

相关推荐
鬼魅-9527几秒前
VS+Qt中使用QCustomPlot绘制曲线标签(附源码)
c++·qt
Star在努力14 分钟前
15-C语言:第15~16天笔记
c语言·笔记·算法
LZQqqqqo16 分钟前
C# 接口(interface 定义接口的关键字)
java·开发语言·c#
CoovallyAIHub19 分钟前
工业质检新突破!YOLO-pdd多尺度PCB缺陷检测算法实现99%高精度
深度学习·算法·计算机视觉
gb421528719 分钟前
负载均衡算法中的加权随机算法
windows·算法·负载均衡
寒水馨23 分钟前
Java 9 新特性解析
java·开发语言·新特性·java9·jdk9
拓端研究室1 小时前
专题:2025医药生物行业趋势与投融资研究报告|附90+份报告PDF、原数据表汇总下载
android·开发语言·kotlin
xdlka1 小时前
C++初学者4——标准数据类型
开发语言·c++·算法
go54631584651 小时前
大规模矩阵构建与高级算法应用
线性代数·算法·矩阵
向左转, 向右走ˉ2 小时前
为什么分类任务偏爱交叉熵?MSE 为何折戟?
人工智能·深度学习·算法·机器学习·分类·数据挖掘