• Leetcode 136. 只出现一次的数字 异或性质


    地址  https://leetcode-cn.com/problems/single-number/

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
    
    说明:
    
    你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
    
    示例 1:
    
    输入: [2,2,1]
    输出: 1
    示例 2:
    
    输入: [4,1,2,1,2]
    输出: 4
    

    最初的想法肯定是 逐个遍历 使用哈希记录出现个数

    或者排序 逐个检查

    都违反了题目约定

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            sort(nums.begin(),nums.end());
            for(int i = 0;i < nums.size()-1;i+=2){
                if(nums[i]!=nums[i+1])
                    return nums[i];
            }
            return nums.back();
        }
    };
    class Solution {
    public:
    unordered_map<int,int> m;
        int singleNumber(vector<int>& nums) {
            for(auto& e:nums){
                m[e]++;
            }
            for(auto& e:m){
                if(e.second == 1) return e.first;
            }
    
            return 1;
        }
    };

    真正符合题意的代码是 使用了异或性质 同一数字 异或两次等同于没有作用 那么数组所有的元素异或后,剩下的数字就是单个的那个数字

    异或这个性质在写五子棋的时候我也使用了,使用一个随机值记录某个位置 是否落子 如果落子后再次恢复或者悔棋 直接再次异或一下即可。速度客观!!

    AC代码

     1 class Solution {
     2 public:
     3     int singleNumber(vector<int>& nums) {
     4         int res = 0;
     5         for(auto& e:nums){
     6             res ^= e;
     7         }
     8 
     9         return res;
    10     }
    11 };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    java adsl 自动拔号!
    IoC 原理
    JAVA lucene 高并发问题
    C# java通信之webservice cxf Sping
    jquery插件学习(六)
    jquery插件学习(三)
    jquery实战定宽
    jquery插件学习(五)
    jquery插件学习(四)
    Androidsqlite数据库存取图片信息
  • 原文地址:https://www.cnblogs.com/itdef/p/12815388.html
Copyright © 2020-2023  润新知