【刷题笔记】136. 只出现一次的数字

113 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

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

说明:

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

示例 1:

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

示例 2:

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

二、思路分析:

直接使用异或运算,a^b当a,b相同时,结果为0,不同时候,如果a为0,那么结果为b。 同时,异或运算满足交换律。所以,所有的出现两次的数都异或成0,只剩下出现一次的数。

对异或不太了解的可以参考下官方解法中的说明,这里摘抄一下

异或运算有以下三个性质。

任何数和 00 做异或运算,结果仍然是原来的数,即 a0=aa \oplus 0=a
任何数和其自身做异或运算,结果是 0,即 aa=0a \oplus a=0
异或运算满足交换律和结合律,即 aba=baa=b(aa)=b0=ba \oplus b \oplus a=b \oplus a \oplus a=b \oplus (a \oplus a)=b \oplus0=b

三、AC 代码:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int s = 0;
        for(auto& x: nums)
            s ^= x;
        return s;
    }
};

四、总结:

除了第一反应的hash法,暴力法等,异或运算在算法中还是比较巧妙的一个解法,虽然平时开发中用的不太多,但是刷算法还是需要掌握的。

参考

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

通过哈希集、按位异或操作符解决(解题思路) - 只出现一次的数字 - 力扣(LeetCode) (leetcode-cn.com)