[更文刷题] 136. 只出现一次的数字

78 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

一、题目描述:

136. 只出现一次的数字 - 力扣(LeetCode) (leetcode-cn.com)

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

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

示例 2:

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

二、思路分析:

很明显,最简单的方法,就是将每个数都记录一遍,然后再次遍历,要是发现某个数只出现了一次,那么他就是最后的答案。

要是数据范围小的话,可以直接用数组,要是大,可以考虑用HashMap

但是,你不觉得这种方法很蠢吗,又耗时间又耗空间

当我们看到:都是非空整数、出现两次的时候

我们应该想到异或的两个性质:

  • 两个相同的数进行异或,结果为0
  • 0与任何一个数异或,结果都是那一个数

所以这个题目我们使用异或来求解是最方便的

  • 一次遍历
  • 简洁的代码

三、AC 代码:

class Solution {
    public int singleNumber(int[] nums) {
        int num=0;
        for (int i = 0; i < nums.length; i++) {
            num = num ^ nums[i];
        }
        return num;
    }
}

四、总结:

相同的数,用异或或变成0

然后这个数和另一个数做异或,就还是这个数

根据结合律,a^(a^c) = (a^a)^c,所以不断地做异或,最后的一定是只出现过一次的那个数字

参考

只出现一次的数字(C++ 「1个数/2个数」同类题一网打尽)

【track & traning】一行代码,思路简单,性能高效接近90

【只出现一次的数字】【C语言详解】【3种思路】【超级详细】