首页 > 其他分享 >137. 只出现一次的数字 II

137. 只出现一次的数字 II

时间:2023-06-25 13:58:05浏览次数:41  
标签:cnt 数字 int 32 复杂度 II 137 mod

137. 只出现一次的数字 II

题目描述

image

题解

最简单的方法是设置一个哈希表进行计数,能够方便地寻找到最小值,但是这样需要 \(O(n)\) 的空间去存放哈希表。因此这里提供一种更好的算法(位数统计)能够使空间复杂度降为常数。
由于int类型为32位二进制,于是设置一个长度为32的数组 \(cnt\) 记录数组nums中的每一个数值位出现过多少次1(对所有元素的每个数值位进行统计,而不是统计单个元素的数值位)。再对 \(cnt\) 的每一位做 mod 3 的运算操作,之后就可以得到只出现一次的数字。
考虑样例 [1,1,1,3],1 和 3 对应的二进制表示分别是 00..001 和 00..011,于是 \(cnt\) 数组为 [0,0,...,1,4]。对每一位进行 mod 3 操作后变为 [0,0,...,1,1],再转换为十进制就成为了3,即为答案。
需要注意的是,由于普通的int为有符号数,右移操作符为算数右移,与上面描述的算法不相符合(我们需要左边补0,即逻辑右移操作),因此需先将其转为无符号数。

class Solution 
{
public:
    int singleNumber(vector<int>& nums) 
    {
         vector<int> cnt(32, 0);
         for(unsigned x : nums)
         {
             for(int i = 0; i < 32; i++)
             {
                 if(((x >> i) & 1) == 1)
                    cnt[i]++;
             }
         }
         int ans = 0;
         for(int i = 0; i < 32; i++)
         {
             cnt[i] %= 3;
             if(cnt[i] & 1 == 1)
             {
                 ans += (1 << i);
             }
         }
         return ans;
    }
    
    
};

时间复杂度为 \(O(n)\),空间复杂度为 \(O(1)\)
推广一下,如果一个数组中只有一个元素出现了一次而其余元素出现了k次,只需将mod 3 改成 mod k 即可。

标签:cnt,数字,int,32,复杂度,II,137,mod
From: https://www.cnblogs.com/parallel-138/p/17502538.html

相关文章

  • 数字图像处理《3、灰度变换与空间滤波》
      第三章:空间域处理1、 空间域处理是指在图像的像素上操作,主要分为灰度变换和空间滤波:灰度变换的主要目的是对比度处理和阀值处理;空间滤波的主要目的是改善图像的性能,如锐化图像;2、 基本的灰度变换函数:图像反转、对数变换、伽马变换、分段线性变换;3、 还有基于直方图的灰度......
  • heapq大小写字母数字混合堆
    importheapqlst=list("AbSZDYM6BTXHU")print(lst)#['A','b','S','Z','D','Y','M','6','B','T','X','H','U&......
  • IIS 下实现http强装到https
    1、准备证书①打开IIS管理控制台,双击“服务器证书”。②在弹出的窗口中,单击右上角“导入”。③导入证书文件,注意申请证书时如果填写了密码,这里也要输入相关密码。2、绑定https,让站点可以接收http和https①右击网站站点,选择“编辑绑定”②在弹出的窗口中,单击“添加”按......
  • 【LeetCode摩尔投票】有趣的简单题:数组中出现次数超过一半的数字
    数组中出现次数超过一半的数字https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入:[1,2,3,......
  • #yyds干货盘点# LeetCode程序员面试金典:单词拆分 II
    题目:给定一个字符串s和一个字符串字典 wordDict ,在字符串 s 中增加空格来构建一个句子,使得句子中所有的单词都在词典中。以任意顺序返回所有这些可能的句子。注意:词典中的同一个单词可能在分段中被重复使用多次。 示例1:输入:s="catsanddog",wordDict=["cat","cats","......
  • shell脚本双中括号比较数字踩坑
    shell的双中括号中,由于可以直接使用大于和小于号,便自作聪明认为可以直接判断两个数字的大小,直到遇到了以下的情况[core@localhost~]$a=5;b=3;if[[$a>$b]];thenechoaisbigger;elseechobisbigger;fi#结果输出aisbigger,结果是正确的#但是如果两个数字不是......
  • 31 IIC(九)iic adapter
    代码1iicadapter驱动架构i2cadapter设备是挂载于platformbus整体重点架构如下分配structi2c_adapter*adap=kzalloc(sizeof(structi2c_adapter),GFP_KERNEL);设置adapter->owner=THIS_MODULE;adapter->algo=&i2c_algo;注册ret=i2c_add_adapter(a......
  • 数字化身:未来的个人化人工智能
    第一节:引论随着人工智能技术的发展,我们正在步入一个人人都能拥有自己数字化身的时代。数字化身是一个模拟个人思维方式、行为习惯和语言风格的人工智能。它们可以代表我们在各种场合发言,也可以与其他智能体进行互动。这样的概念听起来像科幻小说,但实际上它们正在逐步成为现实。......
  • leetcode 113 路径总和2 path-sum-ii【ct】
    ===思路:很简单,记得递归的时候传入path.slice ......
  • 【剑指Offer】40、数组中只出现一次的数字
    【剑指Offer】40、数组中只出现一次的数字题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。解题思路:这道题目相对比较难,一般情况下,我们首先可以想到的是顺序扫描数组,但其时间复杂......