20天刷题计划-136. 只出现一次的数字

112 阅读2分钟

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

一、题目描述:

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

说明:

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

示例 1:

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

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/si…

二、思路分析:

这题拿到手,第一反应是用hash表,使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。但是不满足你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?,不满足题意。那么如何才能做到线性时间复杂度和常数空间复杂度呢?可使用异或运算

和结合按位异或操作符的性质我们可以发现一个按位异或操作的性质:一个值和0进行按位异或操作所得为该值,相同的两个值进行异或操作,所得为0。

根据这个性质,由于每个重复元素重复两次,故他们在遍历后将相互抵消,而唯一元素只出现一次,故将得到保留,依此逻辑,完成代码开发

三、AC 代码:

class Solution {
    public int singleNumber(int[] nums) {
        int single = 0;
        for (int num : nums) {
            single ^= num;
        }
        return single;
    }
}

四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐