当前位置: 首页 > news >正文

⭐算法OJ⭐位操作 Single Number 系列(C++实现)

136. Single Number

Given a non-empty array of integers nums, every element appears twice except for one. Find that single one.
You must implement a solution with a linear runtime complexity and use only constant extra space.

给定一个数组,找出 frequency 为1的数字(有唯一解),其他数字的 frequency 为2

  • 先排序,再比对查找, O ( n log ⁡ n ) O(n \log n) O(nlogn)
  • bit 操作,XOR 的性质: A ⊕ A = 0 A\oplus A = 0 AA=0, A ⊕ 0 = A A \oplus 0 = A A0=A, …
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        // A XOR A = 0, A XOR 0 = A
        int res = 0;
        for (int num: nums) {
            res = res ^ num;
        }
        return res;
    }
};

137. Single Number II

Given an integer array nums where every element appears three times except for one, which appears exactly once. Find the single element and return it.

You must implement a solution with a linear runtime complexity and use only constant extra space.

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        vector<int> bitCount(32, 0);
        for (int i = 0; i < 32; i++) {
            int mask = 1 << i;
            for (auto num: nums) {
                if (num & mask) {
                    bitCount[i]++;
                }
            }
        }
        
        int ans = 0;
        for (int i = 0; i < 32; i++) {
            if (bitCount[i] % 3) {
                ans += 1 << i;
            }
        }
        return ans;
    }
};

位运算:

  • 对于每个二进制位,统计所有数字在该位上出现的次数。
  • 如果一个数字出现了三次,那么它的每个二进制位上的 1 也会出现三次。
  • 只出现一次的数字的二进制位上的 1 只会出现一次。

状态机:

  • 使用两个变量 onestwos 来记录每个二进制位的状态:
  • ones:表示当前位出现 1 的次数是否为 1 次。
  • twos:表示当前位出现 1 的次数是否为 2 次。
  • 当一个位出现 3 次时,重置为 0。
int singleNumber(vector<int>& nums) {
    int ones = 0, twos = 0;
    for (int num : nums) {
        ones = (ones ^ num) & ~twos;
        twos = (twos ^ num) & ~ones;
    }
    return ones;
}

260. Single Number III

  • 首先,对整个数组进行异或运算,得到的结果是两个只出现一次的数的异或值,记为 xor。
  • 然后,找到 xor 中任意一个为 1 的二进制位(这个位表示两个数在该位上不同)。
  • 根据这个二进制位,将数组分为两组:
    • 一组是该位为 1 的数。
    • 另一组是该位为 0 的数。
  • 分别对这两组进行异或运算,得到的结果就是两个只出现一次的数。
class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int axorb = 0;
        for (int num: nums) {
            axorb ^= num;
        }
        int bit = -1;
        for (int i = 0; i < 32; i++) {
            if (axorb & (1 << i)) {
                bit = i;
                break;
            }
        }
        // bit is the rightmost digit that a differs from b
        int first = 0;
        for (int a: nums) {
            if (a & (1 << bit)) {
                first ^= a;
            }
        }
        // identify the first unique number whose digit at *bit* digit is 1
        int second = axorb ^ first;
        // inverse operation
        return {first, second};
    }
};

相关文章:

  • char和varchar的不同
  • zabbix数据采集以及自定义监控
  • Python零基础学习第二天(条件语句,循环语句)
  • 【C语言】指针笔试题
  • 架构设计系列(六):缓存
  • 【docker】namespace底层机制
  • 使用 Python 进行批量解压 .rar 文件
  • 基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)
  • 架构思维:架构的演进之路
  • Wireshark简单教程
  • 【蓝桥杯集训·每日一题2025】 AcWing 5437. 拐杖糖盛宴 python
  • 【数据库】常见的数据库和它们的适用场景
  • 【Android】用 chrome://inspect/#devices 调试H5页面
  • DeepSeek在MATLAB上的部署与应用
  • IP-------GRE和MGRE
  • ubuntu-server 安装 navidia 显卡驱动
  • 深圳南柯电子|医疗设备EMC测试整改检测:零到一,保障医疗安全
  • 机器视觉--线扫相机触发
  • DeepSeek 高效提问指南
  • 半精度 单精度 双精度 概述
  • 浙江省委金融办原副主任潘广恩被“双开”
  • 2025年“新时代网络文明公益广告”征集展示活动在沪启动
  • 收到延期付款利息,该缴纳增值税吗?
  • 江西3人拟提名为县(市、区)长候选人
  • 思想史家陈谷嘉逝世,曾为岳麓书院当代复兴奠定重要基础
  • 牛市早报|4月新增社融1.16万亿,降准今日正式落地