美文网首页
只出现一次的数字

只出现一次的数字

作者: susu2016 | 来源:发表于2018-04-20 11:31 被阅读22次

    转载:https://blog.csdn.net/xy913741894/article/details/52145043

    只出现一次的数字

    题目描述:

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

    说明:

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

    思路:

    利用异或的性质:一个数字异或它自己结果为0,异或0结果为它自己即 a^a=0,a^0=a,且异或满足 a^b^c=a^(b^c) 。
    2 ^ 2 = 0
    2 ^ 2 ^ 3 = 3
    2 ^ 3 ^ 2 = 3​
    
        public int singleNumber(int[] nums) {
            int result = nums[0];
            for (int i = 1; i < nums.length; i++) {
                result^=nums[i];
            }
            return result;
        }
    

    相关题目:

    一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,请找出这两个数字。

    思路:
    在上题的基础上,我们不妨可以把原数组分为两个子数组。在每个子数组中,包含一个只出现一次的数字,而其它数字都出现两次。如果能够这样拆分原数组,按照前面的办法就是分别求出这两个只出现一次的数字了。
    我们还是设置一个ret异或每个数组元素,由于其它数字都出现了两次,在异或中全部抵消为0,那么最终得到的结果就是两个只出现一次的数字的异或结果ret。由于这两个数字不一样,那么这个异或结果ret肯定不为0 ,即这个结果数字的二进制表示中至少就有一位为1 。我们在结果数字中找到第一个为1 的位的位置,记为第pos 位。我们以第pos 位是不是1 为标准把原数组中的数字分成两个子数组,第一个子数组中每个数字的第pos 位都为1 ,而第二个子数组的每个数字的第pos位都为0 。最后将子数组按照之前方法就可以分别得到各自的唯一数字。

    相关文章

      网友评论

          本文标题:只出现一次的数字

          本文链接:https://www.haomeiwen.com/subject/yieakftx.html