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

力扣136.只出现一次的数字


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

一、题目描述

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

请你找出那个只出现了一次的元素。

要求:

  • 时间复杂度为 O(n)
  • 空间复杂度为 O(1)

示例:

复制代码
输入:nums = [2,2,1]
输出:1

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

输入:nums = [1]
输出:1

二、思路分析

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

常见思路有两个:

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

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

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

  • 遍历数组,把数字加入 Set。
  • 如果已经存在,就移除它。
  • 遍历结束后,Set 里只会留下那个只出现一次的数。

代码

java 复制代码
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

代码

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

复杂度

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

五、方法对比

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

六、进阶拓展

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

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

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

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

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


七、总结

  • 如果不考虑空间复杂度,Set 是最容易想到的方案。
  • 如果追求最佳解,位运算 XOR 是唯一王道
  • 理解 XOR 的数学本质,可以帮助你秒杀一类经典问题。

相关推荐
MC丶科4 分钟前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
怪兽20149 分钟前
Redis常见性能问题和解决方案
java·数据库·redis·面试
zz-zjx10 分钟前
JVM 内存结构与 GC 机制详解( 实战优化版)
java·jvm·tomcat
nvvas21 分钟前
Android Studio JAVA开发按钮跳转功能
android·java·android studio
小O的算法实验室29 分钟前
2022年ASOC SCI2区TOP,基于竞争与合作策略的金字塔粒子群算法PPSO,深度解析+性能实测,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
CV工程师丁Sir38 分钟前
Rokid设备连接全解析:蓝牙与Wi-Fi通信源码深度剖析
java
zoyation41 分钟前
多线程简介和在JAVA中应用
java·开发语言
南莺莺41 分钟前
邻接矩阵的基本操作
数据结构·算法··邻接矩阵
rechol1 小时前
类与对象(中)笔记整理
java·javascript·笔记
周杰伦_Jay1 小时前
【Spring Boot从入门到精通】原理、实战与最佳实践
java·spring boot·后端