【LC100】No136. 只出现一次的数字

题目描述

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

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

提示:

  • 1 <= nums.length <= 3 * 104

  • -3 * 104 <= nums[i] <= 3 * 104

  • 除了某个元素只出现一次以外,其余每个元素均出现两次。

示例

示例 1:

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

示例 2:

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

示例 3:

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

链接

https://leetcode.cn/problems/single-number/description/?envType=study-plan-v2&envId=top-100-liked

思路

初看是能和“两数之和”比肩的简单题。

但题目要求,空间复杂度 O(n),时间复杂度 O(1)。于是瞬间干掉了我们的排序法、暴力法和哈希表法等一众解题方法。

淦。

解法一:异或邪修

加入邪修!加入邪修!

本题用到了一些异或的性质:

  • 0 和任何数异或都是数本身

  • 任何数和自身异或都是 0

  • 异或运算支持交换律和结合律

因此,直接将所有数字异或后,得到结果就是只出现一次的数字。

代码

class Solution {
    public int singleNumber(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int val = 0;
        for (int num : nums) {
            val ^= num;
        }
        return val;
    }
}
  • 时间复杂度:O(n)

  • 空间复杂度:O(1)


【LC100】No136. 只出现一次的数字
https://tiamo495.com//archives/lc100-no136.-zhi-chu-xian-yi-ci-de-shu-zi
作者
tiamo495
发布于
2025年07月19日
许可协议