LeetCode笔记:136. Single Number 单身狗数问题

版权声明:转载请注明出处。 https://blog.csdn.net/weixin_41657493/article/details/87596737

觥筹交错的夜,有人在调情,有人在调代码。情人节刚过,让我们看一道应景的算法题,136. Single Number,我给他起名叫单身狗数问题。

问题

Given a non-empty array of integers, every element appears twice except for one. Find that single one. Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

分析

这道题目的大意是:给定一个非空整数数组,其中所有的元素都会出现两了次,只有一个出现了一次,找出这只单身狗。比如[2,2,1]中的1,[4,1,2,1,2]中的4。另外题目要求,时间复杂度O(n),空间复杂度O(1)。

思路1

暴力破解。遍历数组将各元素放入map并计数。再遍历map找到计数为1的元素,即为答案。但这种解法使用了额外空间map,显然不是最佳方案,就不放代码演示了。

思路2

位运算。两个二进制数做异或运算,两位相同则为0,两位不同则为1。可以推出,两数相同(即每一位都相同),异或结果为0,即a xor a=0;一个数两次异或同一个数最后结果不变,即(a xor b) xor b = a。所以将数组中的元素依次做异或运算,最后的结果就是只出现一次的那个Single Number。代码如下:

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

这道题可以暴力破解,也有思路很妙的解法,可以说以异或运算的完美实践,学会后有一点恍然大悟的小小幸福感。引人入胜,非常适合作为刷题的入门。位运算在算法题中还是很常用的,需要多多练习培养思路和敏感度。

猜你喜欢

转载自blog.csdn.net/weixin_41657493/article/details/87596737
今日推荐