zoukankan      html  css  js  c++  java
  • 白菜刷LeetCode记-136. Single Number

    吼吼吼,今天进行第三条的程序练习,题目如下:

    数组中除了一个数字,其他数字都是成双的,现在要找出这个单个的数字是什么。啥?人群中成双的一大把,就剩一个单身狗?还要告诉世人哪个才是?这题目有毒。

    继续往下看,要求时间复杂度是线性,而且还建议不用额外的存储量。

    首选的最简单的方法可能就是先将数组排序,然后遍历数组,然后识别出那个旁边没有跟自己一样的数,那个数就是结果了。

     1 /**
     2  * @param {number[]} nums
     3  * @return {number}
     4  */
     5 var singleNumber = function(nums) {
     6     nums.sort();
     7     let res = nums[0];
     8     
     9     for(let i = 1; i < nums.length ; i++){
    10         if(nums[i-1] == nums[i] ){
    11             res -= nums[i];
    12         }else{
    13             res += nums[i];
    14         }
    15     }
    16     
    17     return res;
    18 };

    还有没有更加便利的方法呢?考虑到如果全部数字都是成双的话,那么这个和减去输入数组的和不就是结果么?

    那么重点就是如何算出如果全部数字都是成双后的那个和呢?在javascript标准库里头还是有set这个数据结构的。

     1 /**
     2  * @param {number[]} nums
     3  * @return {number}
     4  */
     5 var singleNumber = function(nums) {
     6     let tnums = new Set(nums);
     7     let sumset = 0, sumarr = 0;
     8     for(let item of tnums) sumset += item;
     9     for(let item of nums) sumarr += item;
    10     
    11     return 2*sumset - sumarr;
    12 };

    还有没有其他的方法呢?看了一下LeetCode里头的第四个用异或实现的答案,我跟小伙伴都惊呆了,以前没记住的关于异或的运算定律冲击着我脆弱的头脑。

    代码如下:

     1 /**
     2  * @param {number[]} nums
     3  * @return {number}
     4  */
     5 var singleNumber = function(nums) {
     6     let res = 0;
     7     
     8     for(let item of nums){
     9         res ^= item;
    10     }
    11     
    12     return res;
    13 };

    这种方法简单方便明了。附上讨论区小伙伴的惊叹作为结束。

  • 相关阅读:
    JSON 数据格式
    Get,Post请求中文乱码问题有效解决方法
    linux下tomcat的配置及项目的部署流程
    tomcat部署javaweb项目的三种方式
    tomcat-users.xml 配置
    在linux下用tomcat部署java web项目的过程与注意事项
    Linux服务器上的tomcat中部署web项目
    用yum快速搭建LAMP平台
    开源邮件系统Zimbra Collaboration – Open Source Edition
    PVID和VID彻底研究(上) ——PVID的作用及和VID的区别
  • 原文地址:https://www.cnblogs.com/sssysukww/p/9524670.html
Copyright © 2011-2022 走看看