当前位置: 首页 > 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.jsqmd.com/news/4477/

相关文章:

  • 一生一芯中有趣的C语言宏:LIST_FOREACH 链表遍历宏 - Zeeh
  • 3. Ollama 安装,流式输出,多模态,思考模型 - Rainbow
  • C#性能优化基础:垃圾回收机制
  • 实验报告1
  • 2025.9.26——1蓝
  • 安装python解释器 - Jun
  • 深入解析MySQL InnoDB锁机制 - 教程
  • 根号
  • 如何在 CentOS 7 上安装 bzip2-libs-1.0.6-13.el7.x86_64.rpm 文件
  • 【A】杂题选将
  • 有一个[1,5]的等概率随机函数fx(),在不改变fx()函数的情况下,利用fx()函数做出一个[1,7]的等概率随机函数。
  • WSL2 磁盘清理
  • 完整教程:1.DHCP服务器
  • 关于OneBot的QQ机器人探索2
  • putty
  • 深入解析:PHP 8.0+ 高级特性深度探索:架构设计与性能优化
  • Django 搭配数据库开发智慧园区系统全攻略 - 详解
  • 客服系统源码二次开发
  • 喜讯!狮桥集团成为天津市行政执法监督企业联系点,共筑法治营商新环境!
  • 完整教程:神经网络torch学习路线规划
  • redis实现分布式锁2
  • PostgreSQL 和 MySQL两个数据库的索引的区别 - 详解
  • 题解:P7334 [JRKSJ R1] 吊打
  • 当不小心误触了一个事件该如何删除呢
  • 跑腿小工具|基于微信小脚本的跑腿平台小程序设计与实现(源码+数据库+文档)
  • Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量 - 教程
  • 烧录工具使用方法大公开:实用说明文档奉上
  • 实用指南:【C++实战㊷】C++ 原型模式实战:从概念到高效应用
  • 警惕新型XCSSET macOS恶意软件变种,专攻Xcode开发者
  • 前端面经-高级开发(华为od) - 实践