【剑斩OFFER】算法的暴力美学——只出现一次的数字 ||

一、题目描述

二、算法原理

我们由题目可得出:3n + 1 个数字,n 表示出现3次数字的类别。

那么我们可以得出3n个数字和只出现1次的数字的每个比特位4种情况:

我们只要得出某个比特位,就能得出32个比特位的,所以这里我们先看其中的一个比特位:

3n个0 + 0 = 0

3n个0 + 1 = 1

3n个1 + 0 =3n

3n个1 + 1 =3n + 1

其中加号的左边是所有出现3次的数字某个比特位的情况,右边是只出现1次的数字的的某个比特位。

最后把 = 号后面的数字 % 3 就是只出现的1次数字的某个比特位,注意:是其中上面四种情况的某一种。

三、代码实现

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;//表示正确答案
        for(int i = 0; i < 32 ; i++)
        {
            int sum = 0;//表示 ret 第 i 位比特位的和
            for(auto e : nums)
            {
                if(((1 << i) & e) != 0) sum++;
            }
            if((sum % 3) == 1) ret = (1 << i) | ret;
        }
        return ret;
    }
};

另外一种解法:

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int unsame;
        for (int i = 0; i < nums.size(); i++)
        {
            if ( i != nums.size()- 1 && nums[i] == nums[i+1]) i += 2;
            else
            {
                unsame =  nums[i];
                break;
            }
        }
        return unsame;
    }
};
相关推荐
_深海凉_2 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
踩坑记录3 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode
旖-旎3 小时前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
谭欣辰3 小时前
C++快速幂完整实战讲解
算法·决策树·机器学习
Mr_pyx4 小时前
【LeetHOT100】随机链表的复制——Java多解法详解
算法·深度优先
AIFarmer4 小时前
【无标题】
开发语言·c++·算法
AGV算法笔记4 小时前
CVPR 2025 最新感知算法解读:GaussianLSS 如何用 Gaussian Splatting 重构 BEV 表示?
算法·重构·自动驾驶·3d视觉·感知算法·多视角视觉
勤劳的进取家5 小时前
数据链路层基础
网络·学习·算法
Advancer-5 小时前
第二次蓝桥杯总结(上)
java·算法·职场和发展·蓝桥杯
ん贤6 小时前
加密算法(对称、非对称、哈希、签名...)
算法·哈希算法