zoukankan      html  css  js  c++  java
  • leetCode 只出现一次的数字 问题记录

    问题如下

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
    
    说明:
    你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
    
    示例 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就是所求的唯一的那个。

  • 相关阅读:
    Android Studio学习笔记(1)
    2019全国大学生电子设计大赛总结
    包与常用模块
    模块
    迭代器、生成器与递归调用
    叠加多个装饰器与有参数的装饰器。
    装饰器
    控制指针的移动、函数
    字符编码
    python 数据类型之列表、元组、字典、集合
  • 原文地址:https://www.cnblogs.com/beliveli/p/9004039.html
Copyright © 2011-2022 走看看