码迷,mamicode.com
首页 > 其他好文 > 详细

leetCode 只出现一次的数字 问题记录

时间:2018-05-07 19:32:07      阅读:523      评论:0      收藏:0      [点我收藏+]

标签:自己   说明   bsp   逻辑   时间复杂度   div   就是   相等   i++   

问题如下

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

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

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

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

 

我的解答如下:

     Arrays.sort(nums);

        if (nums.length == 3){
            if(nums[0] != nums[1]){
                return nums[0];
            }
            if(nums[1] != nums[2]){
                return nums[nums.length-1];
            }
        }

        for(int i = 1;i<nums.length-2;i++){

            if(nums[0] != nums[1]){
                return nums[0];
            }
            if(nums[nums.length-2] != nums[nums.length-1] && nums[nums.length-2] == nums[nums.length-3]){
                return nums[nums.length-1];
            }

            if(nums[i-1] != nums[i] && nums[i] != nums[i+1]){
                return nums[i];
            }
        }
        return nums[0];

思路: 对数组进行排序 然后将i位置的元素与他前后的元素分别进行比较,如果都不相等表示他是唯一一个出现的,然后处理不相等的数据出现在数组头和尾的情况,最后处理数组长度为3和1的情况,这两种情况按上面的逻辑会数组越界。

 

给出的效率最高的解法:

        int xor = 0;
        for (int i = 0; i < nums.length; i++ ) {
            xor ^= nums[i];
        }
        return xor;

其中 ^ 为异或运算符,将数字转换为2进制后按位进行运算,例如:15的2进制表示为1111, 2的2进制表示为0010,那么15^2的结果为1101返回值为13。

a^=b的效果等价于a=a^b。对一个元素连续与另一个元素做两次异或运算后得到的元素还是自己,当对整个数组进行遍历异或运算后最后得到的xor就是所求的唯一的那个。

leetCode 只出现一次的数字 问题记录

标签:自己   说明   bsp   逻辑   时间复杂度   div   就是   相等   i++   

原文地址:https://www.cnblogs.com/beliveli/p/9004039.html

(1)
(2)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!