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

神奇的位运算——力扣136.只出现一次的数字 - 指南

力扣136.只出现一次的数字在这里插入图片描述


【LeetCode题解】只出现一次的数字——Set解法和神奇的位运算

一、题目描述

给你一个 非空整数数组 nums,其中除了某个元素只出现一次以外,其余每个元素均出现两次。
请你找出那个只出现了一次的元素。

要求:

示例:

输入:nums = [2,2,1]
输出:1
输入:nums = [4,1,2,1,2]
输出:4
输入:nums = [1]
输出:1

二、思路分析

这道题一看就让人想到用哈希结构来记录出现次数,但题目明确要求常量额外空间,所以我们要换个角度思考。
常见思路有两个:

  1. HashSet:存进去、出现两次就移除,最后剩下的就是答案。
  2. 位运算(异或 XOR):充分利用数学性质,优雅解决问题。

三、解法一:HashSet(直观思路)

我们先说最容易想到的办法。

代码

import java.util.HashSet;
class Solution
{
public int singleNumber(int[] nums) {
HashSet<
Integer> set = new HashSet<
>();
for (int num : nums) {
if (!set.add(num)) {
set.remove(num);
}
}
return set.iterator().next();
}
}

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

虽然简单直观,但没有满足题目的空间要求。


四、解法二:位运算(异或 XOR)

这才是本题的核心与精华。

异或运算的性质

  1. a ^ a = 0
  2. a ^ 0 = a
  3. 交换律、结合律

结合这三个性质,可以看出:

  • 两个相同的数会互相抵消变成 0
  • 所有数异或一遍,剩下的就是只出现一次的那个数

举例

nums = [4,1,2,1,2]
4 ^ 1 ^ 2 ^ 1 ^ 2
= (1 ^ 1) ^ (2 ^ 2) ^ 4
= 0 ^ 0 ^ 4
= 4

代码

class Solution
{
public int singleNumber(int[] nums) {
int ans = 0;
for (int num : nums) {
ans ^= num;
}
return ans;
}
}

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
    这是题目的最优解。

五、方法对比

方法时间复杂度空间复杂度思路
HashSetO(n)O(n)简单直观,适合入门
XOR位运算O(n)O(1)优雅高效,面试必杀

六、进阶拓展

如果你觉得本题太简单,可以思考以下变种:

  1. 每个数字出现三次,只有一个数字出现一次

    • 可以用位运算统计每一位上 1 出现的次数,对 3 取模即可得到答案。
  2. 有两个数字各出现一次,其他数字出现两次

    • 先整体异或得到 x ^ y,再找出一个不为 0 的二进制位,将数组划分为两组,分别异或即可得到 xy

这些变种同样考验对位运算的理解,适合进一步练习。


七、总结


http://www.zskr.cn/news/12507.html

相关文章:

  • 一生一芯中有趣的C语言宏:LIST_FOREACH 链表遍历宏 - Zeeh
  • 有一个[1,5]的等概率随机函数fx(),在不改变fx()函数的情况下,利用fx()函数做出一个[1,7]的等概率随机函数。
  • 喜讯!狮桥集团成为天津市行政执法监督企业联系点,共筑法治营商新环境!
  • 当不小心误触了一个事件该如何删除呢
  • 跑腿小工具|基于微信小脚本的跑腿平台小程序设计与实现(源码+数据库+文档)
  • 烧录工具使用方法大公开:实用说明文档奉上
  • 【图床】存几张图
  • 什么是 glTF:完整指南
  • WSL2搭建wordpress遇到的一点问题
  • 430亿美元押注英国,Salesforce 加码 AI 投资
  • C# 中 ref 和 out 的学习笔记
  • NXP - 在MCUXpresso IDE中编译调试Smoothieware固件工程 - 思路 - 教程
  • 5G车载市场新格局:国产崛起,从破局者到引领者的升维之战 - 实践
  • 手撕深度学习之CUDA并行规约算法(上篇):硬核揭秘200%性能提升的GPU优化之道,从硬件特性到算法实现的完整进阶指南
  • 详细介绍:八股已死、场景当立(微服务保护篇)
  • 《“悬荡”于理想与现实之间:一份关于人机共生未来的思想实验评估》
  • 区别:RS-232、RS-422、RS-485
  • 【征文计划】深度剖析 Rokid SLAM 算法:从传感器融合到空间重建的完整技术链路 - 实践
  • 登录 Linux 自动展示 CPU/内存/磁盘挂载使用情况等信息(针对于银河麒麟调整的)
  • 解码数据结构线性表之链表
  • 高通QCS8550开发板 + DeepSeek-R1:打造智能化商场导购实践
  • 《对软件工程的初步理解》
  • B3863 [GESP202309 一级] 买文具
  • B2009 计算 (a+b)/c 的值
  • 详细介绍:【杂谈】Godot 4.5下载指南
  • 安全帽检测数据集-YOLO格式建筑工地安全图像数据-个人防护装备(PPE)目标检测算法训练-包含安全帽/无安全帽/等多类别标注-深度学习计算机视觉应用-工业安全监控系统开发-实时预警检测模型
  • WPF ItemsControl implement Select in mvvm via behavior
  • 服务器密码错误被锁定如何解决?
  • 螺纹偏弱
  • 水翼式搅拌机推荐品牌/推荐厂家/优质供应商/哪家强?