• 力扣每日一题136:只出现一次的数字


    题目描述:

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

    你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

    示例 1 :

    输入:nums = [2,2,1]
    输出:1
    

    示例 2 :

    输入:nums = [4,1,2,1,2]
    输出:4
    

    示例 3 :

    输入:nums = [1]
    输出:1
    

    提示:

    • 1 <= nums.length <= 3 * 104
    • -3 * 104 <= nums[i] <= 3 * 104
    • 除了某个元素只出现一次以外,其余每个元素均出现两次。

    通过次数

    975.3K

    提交次数

    1.3M

    通过率

    72.8%

    思路和题解:

    思路一:暴力枚举

    每次从数组中取出一个数,然后从剩余的数中查找,如果找不到就说明这个数只出现一次。时间复杂度O(n^2),空间复杂度O(1),时间复杂度不符合要求

    思路二:排序

    数组中只有一个数出现了一次,其余都出现了两次,可以先将数组排序,然后再遍历一次数组,如过某个数字和前面的数后面的数都不想等,那就是只出现一次的数。时间复杂度O(nlog n),空间复杂度O(1),空间复杂度符合条件,时间复杂度不知道不知道算不算线性。

    思路三:建立映射表

    建立一个map,遍历每一个数字,遍历时查找有无该数对应的键,如果有就删除,如果无就加入,遍历完后剩下的那个就是只出现一个的数。

    思路四:位运算

    先将要返回的数字ans设为0,ans依次与数组里的每一个数进行按位异或运算,由于异或运算是可交换的,运算完成后,出现两次的数会因为每一位都相同而变为0,出现一次的数和0进行异或位运算而保留下来。时间复杂度O(n),空间复杂度O(1),都符合要求。代码:

    1. class Solution{
    2. public:
    3. int singleNumber(vector<int>& nums)
    4. {
    5. int ans=0;
    6. for(int i=0;isize();i++)
    7. ans^=nums[i];
    8. return ans;
    9. }
    10. };

  • 相关阅读:
    Design for failure常见的12种设计思想
    方舟生存进化开服需要多少钱
    【Proteus仿真】【51单片机】水质监测报警系统设计
    2013-2020年全国31省数字经济数据集
    创建型模式 - 简单工厂模式StaticFactoryMethod
    使用正则表达式分割字符串
    >>数据管理:读书笔记|第一章 数据管理
    命令历史应用
    服务器上部署python脚本
    Happens-Before规则详解
  • 原文地址:https://blog.csdn.net/m0_73441691/article/details/133832210