5.4 位运算专题:LeetCode 137. 只出现一次的数字 II
1. 题目链接
LeetCode 137. 只出现一次的数字 II
2. 题目描述
给定一个整数数组 nums,其中每个元素均出现 三次,除了一个元素只出现 一次。请找出这个只出现一次的元素。
要求:
- 时间复杂度为 O(n),空间复杂度为 O(1)。
示例:
- 输入:
nums = [2,2,3,2]→ 输出:3 - 输入:
nums = [0,1,0,1,0,1,99]→ 输出:99
3. 示例分析
- 常规测试:
nums = [3,3,3,5]→ 输出5。
- 负数测试:
nums = [-1,-1,-1,-2]→ 输出-2。
- 大数测试:
nums = [10000,10000,10000,1]→ 输出1。
4. 算法思路
核心思想:逐位统计 + 模 3 运算
- 逐位统计:
- 整数为 32 位,对每一位
i(0 ≤ i < 32),统计所有数字在该位上为1的总次数。
- 整数为 32 位,对每一位
- 模 3 运算:
- 若某一位的总次数
sum % 3 == 1,说明只出现一次的数在该位上为1,否则为0。
- 若某一位的总次数
- 构造结果:
- 将所有满足
sum % 3 == 1的位设置为1,得到最终结果。
- 将所有满足
数学原理:
- 出现三次的数的每个二进制位之和必为 3 的倍数,模 3 后为 0。
- 只出现一次的数在每个二进制位上的值决定了该位模 3 的结果。
5. 边界条件与注意事项
- 负数处理:
- 使用算术右移(保留符号位),确保负数二进制位的正确统计。
- 整数溢出:
- 输入数组中的数可能在
INT_MIN到INT_MAX之间,但算法本身不涉及运算溢出。
- 输入数组中的数可能在
- 全零情况:
- 若所有位统计均为 0,结果为 0(题目保证存在唯一解,无需额外处理)。
6. 代码实现
class Solution
{
public:int singleNumber(vector<int>& nums) {int ret = 0;// // 逐个处理 ret 的每一个比特位(共32位)for (int i = 0; i < 32; i++) {int sum = 0;// 统计第i位为1的总次数for (int x : nums) if (((x >> i) & 1) == 1) sum++;sum %= 3;// 若模3余1,设置该位为1if (sum == 1) ret |= (1 << i);}return ret;}
};

与其他方法的对比
| 方法 | 时间复杂度 | 空间复杂度 | 核心思想 |
|---|---|---|---|
| 位运算法 | O(32n) → O(n) | O(1) | 逐位统计,模3运算 |
| 哈希表法 | O(n) | O(n) | 统计频率,遍历查找 |
| 排序遍历法 | O(n log n) | O(1) | 排序后检查每三个连续元素 |
| 有限状态机 | O(n) | O(1) | 位运算模拟三进制状态转移 |
位运算法的优势
- 无额外空间:仅需常数空间,适合内存敏感场景。
- 兼容性:正确处理负数和大数,无需类型转换。
- 确定性:严格线性时间复杂度,不受数据分布影响。
分步解析
-
初始化结果变量:
int ret = 0;ret初始为0,所有二进制位均为0。
-
逐位统计与构造结果:
- 外层循环:遍历 32 位中的每一位。
for (int i = 0; i < 32; i++) - 内层循环:统计当前位
i的总出现次数。for (int x : nums) {if (((x >> i) & 1) == 1) sum++; } - 模 3 运算:
sum %= 3; - 设置结果位:
if (sum == 1) ret |= (1 << i);
- 外层循环:遍历 32 位中的每一位。
总结
位运算法通过逐位统计和模 3 运算,以 O(n) 时间复杂度和 O(1) 空间复杂度高效解决了“只出现一次的数字 II”问题。其核心思想是将问题分解到每个二进制位上,利用数学性质过滤重复元素。相较于哈希表法和排序法,位运算法在空间和效率上表现更优,尤其适合处理大规模数据或内存受限的场景。
扩展思考:
- 通用性:若问题改为“其他元素出现 k 次”,可将模 3 改为模 k。
- 有限状态机:通过位运算模拟三进制状态转移,可进一步优化常数时间。
关键点:
- 理解二进制位的独立性及模运算的过滤作用。
- 处理负数时算术右移的特性。
相关文章:
5.4 位运算专题:LeetCode 137. 只出现一次的数字 II
1. 题目链接 LeetCode 137. 只出现一次的数字 II 2. 题目描述 给定一个整数数组 nums,其中每个元素均出现 三次,除了一个元素只出现 一次。请找出这个只出现一次的元素。 要求: 时间复杂度为 O(n),空间复杂度为 O(1)。 示例&a…...
Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析(二十一)
Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析 一、引言 在现代 Android 应用开发中,构建响应式和动态的用户界面是至关重要的。Android Compose 作为新一代的声明式 UI 工具包,为开发者提供了一种简…...
3. 轴指令(omron 机器自动化控制器)——>MC_SetPosition
机器自动化控制器——第三章 轴指令 11 MC_SetPosition变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启动运动指令▶多重启运动指令▶异常 MC_SetPosition 将轴的指令当前位置和反馈当前位置变更为任意值。 指令名称FB/FUN图形表现ST表现MC_SetPosition当前位…...
easyExcel2.2.10中为0数据显示为空
在 EasyExcel 2.2.10 中,如果希望将数值为 0 的数据在 Excel 中显示为空(即不显示 0),可以通过以下方法实现: 1. 使用 ExcelProperty 的 format 参数 通过设置单元格格式为 #(# 会忽略 0)&…...
Python+Requests+Pytest+YAML+Allure接口自动化框架
GitHub源码地址(详细注释):源码 调试项目python自主搭建:附项目源码 一、项目介绍 本项目是基于 PythonRequestsPytestYAMLAllure 搭建的 接口自动化测试框架,用于对 REST API 进行测试。 框架的主要特点包括&#…...
spring 核心注解整理
总结一下,核心注解涵盖以下方面: 依赖注入相关注解Bean定义和组件扫描注解配置类相关注解条件化配置注解作用域和生命周期注解AOP相关注解事务管理注解属性注入相关注解测试相关注解Spring Boot核心注解(如果需要) 每个部分列出…...
用 Python 也能做微服务?
一、Python 和微服务,是敌是友? Python 因其极强的开发效率与生态,一直是数据处理、AI、Web 开发的主力选手。但在“微服务”这个领域,它一直处于边缘地带: 服务注册 / 发现?🤷♂️ 没有统一…...
Android 13系统定制实战:基于系统属性的音量键动态屏蔽方案解析
1. 需求背景与实现原理 在Android 13系统定制化开发中,需根据设备场景动态屏蔽音量键(VOLUME_UP/VOLUME_DOWN)功能。其核心诉求是通过系统属性(persist.sys.roco.volumekey.enable)控制音量键的响应逻辑,确…...
Maya基本操作
基本操作 按住ALT键,左键旋转视角,中键平移视角,右键放大缩小视角。 按空格键切换4格视图。 导入FBX格式文件后,无贴图显示。 按6键开启。着色纹理显示 坐标轴相关 修改菜单-左键最上面的虚线。固定修改选项窗口。 选中物体…...
SQL Server Management Studio(SSMS)安装教程
目录 一、SSMS的下载 二、SSMS 的安装 三、连接服务器 四、卸载 SSMS 一、SSMS的下载 1.进入 SQL Server Management Studio 官方下载页面:SQL Server Management Studio点击进入下载页面 2.点击链接开始下载,浏览器右上角会显示下载进度;…...
若依前端框架增删改查
1.下拉列表根据数据库加载 这个是用来查询框 绑定了 change 事件来处理站点选择变化后的查询逻辑。 <el-form-item label"站点选择" prop"stationId" v-has-permi"[ch:m:y]"><el-select v-model"queryParams.stationId" pl…...
LiteratureReading:[2023] GPT-4: Technical Report
文章目录 一、文献简明(zero)二、快速预览(first)1、标题分析2、作者介绍3、引用数4、摘要分析(1)翻译(2)分析 5、总结分析(1)翻译(2)…...
区块链交易
文章目录 交易准备合约和代码逻辑合约compile.jsindex.js 运行 交易 项目来自https://github.com/Dapp-Learning-DAO/Dapp-Learning/blob/main/basic/02-web3js-transaction/README-cn.md 本项目包含对交易进行签名,发送,接收交易回执,验证…...
Walrus 经济模型 101
本文作者:Steve_4P,文章仅代表作者观点。 要点总结 2025 年 3 月 20 日,Walrus 基金会宣布成功融资 约 1.4 亿美元,投资方包括 Standard Crypto、a16z 等机构。Walrus 当前估值约 20 亿美元,其中 7% 代币供应量分配给…...
SpringCould微服务架构之Docker(1)
项目中微服务比较多的时候,一个一个手动的部署太麻烦了,所以就需要用到Docker。 项目部署中的问题: Docker是一种快速交付应用、运行应用的技术。...
mac丝滑安装Windows操作系统【丝滑简单免费】
mac丝滑安装Windows操作系统【丝滑&简单&免费】 记录mac丝滑安装windows系统1、安装免费版 VMware fusion 132、安装Windows镜像文件3、跳过联网安装(完成1后将2拖入1 点点点 即可来到3的环节)4、 安装vmware 工具【非常重要,涉及联网…...
系统与网络安全------网络应用基础(2)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 交换机 认识交换机 交换机,Switch 用户将多台计算机/交换机连接在一起,组建网络 交换机负责为其中任意两台计算机提供独享线路进行通信 非网管型交换机 即插即用交换机 即插即用&…...
eclipse [jvm memory monitor] SHOW_MEMORY_MONITOR=true
eclipse虚拟机内存监控设置SHOW_MEMORY_MONITORtrue D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings org.eclipse.ui.prefs (文件比较多,别找错了) SHOW_MEMORY_MONITORtrue 重启 -xms 1024…...
【论文笔记】生成对抗网络 GAN
GAN 2014 年,Ian Goodfellow 等人提出生成对抗网络(Generative Adversarial Networks),GAN 的出现是划时代的,虽然目前主流的图像/视频生成模型是扩散模型(Diffusion Models)的天下,…...
《鸟哥的Linux私房菜基础篇》---5 vim 程序编辑器
目录 一、vim程序编辑器的简介 二、命令模式快捷键(默认模式) 1、光标移动 2、编辑操作 3、搜索与替换 三、插入模式快捷键 四、底行模式快捷键(按:进入) 五、高级技巧 1、分屏操作 2、多文件编辑 3、可视化…...
spring+k8s 功能说明
以下是一个结合 Kubernetes(k8s) 和 Spring Boot 的完整实例,涵盖应用开发、容器化、部署到 Kubernetes 集群的全流程。 1. 创建 Spring Boot 应用 1.1 项目初始化 使用 Spring Initializr 生成一个简单的 REST API 项目: • 依…...
Enovia许可分析的自动化解决方案
随着企业产品生命周期管理(PLM)需求的不断演变,Enovia许可分析已成为确保资源优化和合规性的关键环节。然而,传统的手动许可分析方法往往效率低下、易出错,并且难以应对大规模数据。为了解决这一挑战,Enovi…...
【Agent】Dify Docker 安装问题 INTERNAL SERVER ERROR
总结:建议大家选择稳定版本的分支,直接拉取 master 分支,可能出现一下后面更新代码导致缺失一些环境内容。 启动报错 一直停留在 INSTALL 界面 我是通过 Docker 进行安装的,由于项目开发者不严谨导致,遇到一个奇怪的…...
【学Rust写CAD】11 2D CAD可用rust库
使用 Rust 开发 2D CAD 应用时,选择合适的库是关键。以下是一些适合用于 2D CAD 开发的 Rust 库和工具,涵盖图形渲染、几何计算、用户界面等方面: 图形渲染 lyon 简介: lyon 是一个用于 2D 图形渲染的 Rust 库,支持路径填充、描边…...
怎样基于安卓部署deepseek?
要在安卓设备上部署DeepSeek(或者类似的深度学习模型),您需要将模型从开发环境迁移到安卓应用中。具体步骤涉及将深度学习模型转化为安卓设备能够运行的格式,并配置安卓应用以支持这种模型的运行。以下是一个简化的步骤指南&#…...
【Excel使用技巧】某列保留固定字段或内容
目录 ✅ 方法一:使用 Excel 公式提取 body 部分 🔍 解释: ✅ 方法二:批量处理整列数据 🚨 注意事项 🚨 处理效果 我想保留Excel某一列的固定内容,比如原内容是: thread entry i…...
a-date-picker 格式化日期格式 YYYY-MM-DD HH:mm:ss
<template><a-range-pickerv-model:value"dateRange":show-time"{ format: HH:mm:ss, // 时间部分格式defaultValue: [moment(00:00:00, HH:mm:ss), moment(23:59:59, HH:mm:ss)] // 默认时间范围}"format"YYYY-MM-DD HH:mm:ss" // 整体…...
vue3,element-plus 表格搜索过滤数据
1、表格数据 // 表格数据 import type { User } from "/interface"; const tableData ref<User[]>([]); 2、 表格搜索过滤数据 // 搜索内容 const search ref(""); // 表格过滤数据 const tableFilterData computed(() >tableData.value.fi…...
WordPress 性能优化技术指南:打造快速加载的网站
WordPress 是全球最流行的内容管理系统(CMS),以其灵活性和易用性深受用户喜爱。然而,随着网站内容和功能的增加,加载速度可能会变慢,影响用户体验和搜索引擎排名。在2025年的数字化环境中,网站性…...
vue中上传接口file表单提交二进制文件流
1.使用elementui上传组件 要做一个选择文件后,先不上传,等最后点击确定后,把file二进制流及附加参数一起提交上去。 首先使用elementui中的上传组件,设置auto-uploadfalse,也就是选择文件后不立刻上传。 <el-uplo…...
