数组中唯一只出现一次的数字


在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。

请找出那个只出现一次的数字。

你可以假设满足条件的数字一定存在。

思考题:

  • 如果要求只使用 O(n) 的时间和额外 O(1) 的空间,该怎么做呢?
数据范围

数组长度 [1,1500]。
数组内元素取值范围 [0,1000]。

样例
输入:[1,1,1,2,2,2,3,4,4,4]输出:3

算法思路

核心思路是使用位运算状态机的概念,通过两个变量(ab)记录每个比特位出现次数的状态(模 3 的结果)。状态转移规则如下:

  • 状态定义:用 (b, a) 表示每个比特位的状态:
    • 00:该位出现次数为 0 或 3 的倍数。
    • 01:该位出现 1 次。
    • 10:该位出现 2 次。
  • 状态转移(输入当前数字 x 的某一位):
    • 输入 0:状态保持不变。
    • 输入 1:状态按 00 → 01 → 10 → 00 循环变化。
  • 更新规则
    • a = (a ^ x) & ~b
    • b = (b ^ x) & ~a(注意:此处 a 是已更新后的值)

最终,a 记录了所有出现一次的数字的比特位,即所求结果。

时间复杂度
  • O(n):遍历数组一次,n 为数组长度。
空间复杂度
  • O(1):仅使用两个额外变量 ab
class Solution {
public:int findNumberAppearingOnce(vector<int>& nums) {int a = 0, b = 0; // 初始化状态为 00for (auto x : nums) { // 遍历每个数字// 更新规则(注意顺序):// 1. 更新 a:利用当前状态 b 和输入 x//    - 当 b=0 时,a 与 x 异或(记录新状态)//    - 当 b=1 时,a 被置 0(状态 10 遇到 1 后变为 00)a = (a ^ x) & ~b;// 2. 更新 b:利用更新后的 a 和输入 x//    - 当 a=0 时,b 与 x 异或(记录新状态)//    - 当 a=1 时,b 被置 0(确保状态合法)b = (b ^ x) & ~a;}return a; // 最终 a 存储出现一次的数字}
};

实例演示

假设输入数组 nums = [2, 2, 3, 2],所有数字的二进制表示:

  • 2010
  • 3011

逐步计算每个比特位的状态变化:

最低位(LSB)
  1. 输入 0(来自 2):
    • 初始状态 (b,a) = (0,0)
    • 更新后:a = (0^0)&~0 = 0, b = (0^0)&~0 = 0 → 状态 00
  2. 输入 0(来自 2):状态保持 00
  3. 输入 1(来自 3):
    • a = (0^1)&~0 = 1, b = (0^1)&~1 = 0 → 状态 01
  4. 输入 0(来自 2):状态保持 01
    • 最终状态 01 → 该位为 1
中间位
  1. 输入 1(来自 2):
    • a = (0^1)&~0 = 1, b = (0^1)&~1 = 0 → 状态 01
  2. 输入 1(来自 2):
    • a = (1^1)&~0 = 0, b = (0^1)&~0 = 1 → 状态 10
  3. 输入 1(来自 3):
    • a = (0^1)&~1 = 0, b = (1^1)&~0 = 0 → 状态 00
  4. 输入 1(来自 2):
    • a = (0^1)&~0 = 1, b = (0^1)&~1 = 0 → 状态 01
    • 最终状态 01 → 该位为 1
最高位
  1. 输入 0(来自 2):状态保持 00
  2. 输入 0(来自 2):状态保持 00
  3. 输入 0(来自 3):状态保持 00
  4. 输入 0(来自 2):状态保持 00
    • 最终状态 00 → 该位为 0

最终结果:二进制 011 = 十进制 3
输出:3(符合预期)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88709.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88709.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88709.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从语音识别到智能助手:Voice Agent 的技术进化与交互变革丨Voice Agent 学习笔记

From Research AI&#xff1a; 最近看到 Andrew Ng 的一句话让我印象深刻&#xff1a;“While some things in AI are overhyped, voice applications seem underhyped right now.”&#xff08;尽管 AI 中有些领域被过度炒作&#xff0c;语音应用却似乎被低估了&#xff09;。…

什么是Jaccard 相似度(Jaccard Similarity)

文章目录✅ 定义&#xff1a;&#x1f4cc; 取值范围&#xff1a;&#x1f50d; 举例说明&#xff1a;&#x1f9e0; 应用场景&#xff1a;⚠️ 局限性&#xff1a;&#x1f4a1; 扩展概念&#xff1a;Jaccard 相似度&#xff08;Jaccard Similarity&#xff09; 是一种用于衡量…

ragflow_多模态文档解析与正文提取策略

多模态文档解析与正文提取策略 RAGflow的文档解析系统位于deepdoc/parser/目录下,实现了对多种文档格式的统一解析处理。该系统采用模块化设计,针对不同文档格式提供专门的解析器,并通过视觉识别技术增强解析能力。本文将深入探讨RAGflow的文档解析系统的设计原理、实现细节…

数据结构栈的实现(C语言)

栈的基本概念栈是一种特殊的线性存储结构&#xff0c;是一种操作受到限制的线性表&#xff0c;特殊体现在两个地方&#xff1a;1、元素进栈出栈的操作只能从同一端完成&#xff0c;另一端是封闭的&#xff0c;通常将数据进栈叫做入栈&#xff0c;压栈等&#xff0c;出栈叫做弹栈…

【springboot】IDEA手动创建SpringBoot简单工程(无插件)

大致步骤 创建Maven工程 引入依赖 提供启动类 详细教程 创建Maven工程 修改pom.xml文件 添加父节点 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.3</…

独立开发第二周:构建、执行、规划

一 第二周的独立开发旅程落下帷幕。相较于第一周的适应&#xff0c;本周的核心词是“聚焦”与“执行”。 目标非常明确&#xff1a;在产品开发上取得进展&#xff1b;在个人工作节奏上&#xff0c;将上周初步形成的框架进行实践与固化。 同时&#xff0c;为至关重要的自媒体运营…

在YOLO-World中集成DeformConv、CBAM和Cross-Modal Attention模块的技术报告

在YOLO-World中集成DeformConv、CBAM和Cross-Modal Attention模块的技术报告 1. 引言 1.1 项目背景 目标检测是计算机视觉领域的核心任务之一,而YOLO(You Only Look Once)系列算法因其出色的速度和精度平衡而广受欢迎。YOLO-World是YOLO系列的最新发展,专注于开放词汇目标…

从UI设计到数字孪生实战应用:构建智慧金融的风险评估与预警平台

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;传统金融风控的 “滞后困境” 与数字孪生的破局之道金融风险的隐蔽性、突…

【Linux】权限相关指令

前言&#xff1a; 上两篇文章我们讲到了&#xff0c;关于Linux中的基础指令。 【Linux】初见&#xff0c;基础指令-CSDN博客【Linux】初见&#xff0c;基础指令&#xff08;续&#xff09;-CSDN博客 本文我们来讲Linux中关于权限中的一些指令 shell命令 Linux严格来说是一个操…

前端学习3--position定位(relative+absolute+sticky)

继上一篇&#xff0c;做下拉菜单的时候&#xff0c;涉及到了position&#xff0c;这篇就来学习下~先看下position在下拉菜单中的应用&#xff1a;一、关键代码回顾&#xff1a;/* 下拉菜单容器 */ .dropdown {position: relative; /* ➊ 关键父级 */ }/* 下拉内容&#xff08;默…

APP Inventor使用指南

APP Inventor使用指南一、组件介绍二、逻辑设计设计方法&#xff1a;设计实例&#xff08;参考嘉立创教程&#xff09;点击跳转 &#xff1a; app inventor&#xff08;点不开的话需要&#x1fa84;&#x1fa84;&#x1fa84;&#x1fa84;&#x1fa84;&#xff09; 一、组…

SpringAI实现保存聊天记录到redis中

redis相关准备添加依赖我利用redission来实现<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.37.0</version> </dependency>添加配置文件spring:redis:database: 5host: 127.0.0.1…

Unity中使用EzySlice实现模型切割与UV控制完全指南

引言 在Unity中实现3D模型的动态切割是一个常见的需求&#xff0c;无论是用于游戏特效、建筑可视化还是医疗模拟。本文将全面介绍如何使用EzySlice插件实现高效的模型切割&#xff0c;并深入探讨如何通过Shader Graph精确控制切割面的UV映射。 第一部分&#xff1a;EzySlice基…

【c++学习记录】状态模式,实现一个登陆功能

状态模式建议为对象的所有可能状态新建一个类&#xff0c; 然后将所有状态的对应行为抽取到这些类中。 原始对象被称为上下文 &#xff08;context&#xff09;&#xff0c; 它并不会自行实现所有行为&#xff0c; 而是会保存一个指向表示当前状态的状态对象的引用&#xff0c;…

Docker 搭建 Harbor 私有仓库

1 部署 Harbor 注意&#xff1a;docker、docker-compose、Harbor的版本是否适配&#xff0c;这里使用的版本如下表&#xff1a; Docker版本Docker Compose版本Harbor版本v19.09.8v1.29.2v2.8.2 1.1 安装 docker-compose # 下载 docker-compose 1.29.2 版本 curl -L "h…

C++类模板继承部分知识及测试代码

目录 0.前言 1.类模板基本使用 2.类模板继承 2.1类模板继承过程中的模板参数 情况1&#xff1a;父类非模板&#xff0c;子类为模板 情况2&#xff1a;父类模板&#xff0c;子类为非模板 情况3&#xff1a;父类模板&#xff0c;子类为模板 3.STL中的模板类分析 3.1STL中…

Laravel + Python 图片水印系统:实现与调试指南

前言 本系统通过 Laravel 作为前端框架接收用户上传的图片&#xff0c;调用 Python 脚本处理水印添加&#xff0c;最终返回处理后的图片。这种架构充分利用了 Laravel 的便捷性和 Python 图像处理库的强大功能。 一、Python 水印处理脚本 from PIL import Image, ImageEnhance …

【速通RAG实战:企业应用】25、从数智化场景看RAG:是临时方案,还是终局架构?

引言&#xff1a;RAG为何成为数智化场景的"必争之地"&#xff1f; 当ChatGPT在2023年掀起生成式AI浪潮时&#xff0c;一个矛盾逐渐凸显&#xff1a;大语言模型&#xff08;LLM&#xff09;能生成流畅文本&#xff0c;却常陷入"幻觉"&#xff08;虚构事实&a…

[Python] -实用技巧篇1-用一行Python代码搞定日常任务

在日常开发或数据处理过程中,我们常常为了一些简单的小任务写出数行代码。但实际上,Python 提供了大量强大且简洁的语法糖和标准库工具,让你用“一行代码”轻松搞定复杂操作。 本文将通过多个典型场景展示如何用“一行 Python 代码”高效完成常见任务。 一、文件操作:快速…

单细胞入门(1)——介绍

一、单细胞转录组测序流程介绍 单细胞测序能够探索复杂组织中单个细胞的不同生物学特性&#xff0c;帮助我们认识细胞与细胞之间的差异。这些检测方法有助于研究细胞谱系、细胞功能、细胞分化、细胞增殖和细胞应答&#xff0c;提升我们对复杂生物系统的理解&#xff0c;包括肿…