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

leetcode137. 只出现一次的数字 II

时间:2024-12-30 18:56:47浏览次数:3  
标签:count 数字 nums 位是 00000010 个数 ret II leetcode137

题目:

        给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1:

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

示例 2:

输入:nums = [0,1,0,1,0,1,99]
输出:99

核心逻辑:

        计算出数组中所有数的二进制的每一位的1的个数,如果某位上1的个数 %3 等于 0,那么要么有3的倍数个1,要么没有1;如果不等于0,也就是1的个数不是3的倍数。

逐位(从右向左)统计每一位的1的个数:

for(int i=0; i<32; i++)
  • 使用一个循环来检查整数的每一位(从第0位到第31位,总共32位,考虑的是整型在二进制中的表示)。
int count = 0;
for(int num : nums)
{
    if((num >>> i & 1) == 1)
    {
        count++;
    }
}

遍历数组中每一个数的第i位(右移i个),如果这个位等于1,count就加1。

判断第 i 位是否属于目标数字:

            if(count % 3 != 0)
            {
                ret = ret | 1<<i;
            }
  • 如果 count % 3 != 0,说明目标数字在第 i 位有1(因为其他数字都出现了3次,其1的个数对3取模一定为0)。
  • 使用按位或操作 ret | 1<<i 将结果的第 i 位设置为1。

例子:

我们用数组 nums = [2, 2, 3, 2] 来举例分析代码的执行过程,找出只出现一次的数字。

数字的二进制表示:

  • 2 的二进制表示是 00000010 (8位只显示低位,实际是32位)
  • 3 的二进制表示是 00000011

所以 nums 的二进制形式是:

2: 00000010
2: 00000010
3: 00000011
2: 00000010

按位统计每一位的 1 的个数

我们依次对每一位统计 1 的个数。外层循环遍历 32 位(从第 0 位到第 31 位),每一位的处理过程如下:

第 0 位

看第 0 位(从右向左数):

2: 00000010 -> 第 0 位是 0
2: 00000010 -> 第 0 位是 0
3: 00000011 -> 第 0 位是 1
2: 00000010 -> 第 0 位是 0

统计:第 0 位有 1 的个数是 1

count % 3 != 0,所以 ret 的第 0 位是 1

第 1 位

看第 1 位(从右向左数):

2: 00000010 -> 第 1 位是 1
2: 00000010 -> 第 1 位是 1
3: 00000011 -> 第 1 位是 1
2: 00000010 -> 第 1 位是 1

统计:第 1 位有 1 的个数是 4

count % 3 == 0,所以 ret 的第 1 位是 0

第 2 位

看第 2 位(从右向左数):

2: 00000010 -> 第 2 位是 0
2: 00000010 -> 第 2 位是 0
3: 00000011 -> 第 2 位是 0
2: 00000010 -> 第 2 位是 0

统计:第 2 位有 1 的个数是 0

count % 3 == 0,所以 ret 的第 2 位是 0

其他高位

从第 3 位到第 31 位,所有数字的这一位都是 0,所以统计的 1 的个数都是 0

count % 3 == 0,所以 ret 的这一位都是 0

最终结果

合并各个位的结果,ret 的二进制表示是:

00000011
class Solution 
{
public:
    int singleNumber(vector<int>& nums) 
    {
        int ret = 0;
        for(int i=0; i<32; i++)
        {
            int count = 0;//不能放到外面,每一轮都要清零
            for(int num : nums)
            {
                if((num>>i & 1) == 1)
                {
                    count++;
                }
            }
            if(count % 3 != 0)
            {
                ret = ret | 1<<i;
            }
        }
        return ret;
    }
};

标签:count,数字,nums,位是,00000010,个数,ret,II,leetcode137
From: https://blog.csdn.net/2401_83634908/article/details/144829538

相关文章

  • 中小企业数字化转型必备工具:看板工具
    随着数字化技术的飞速发展,无纸化办公已成为企业追求现代化管理的重要目标之一。无纸化办公,顾名思义,就是通过计算机、网络及电子设备,替代传统的纸质文件和手工操作的办公方式。早在2013年,国务院发布的《党政机关厉行节约反对浪费条例》就明确要求各级机关推广无纸化办公,以减少资源......
  • C# 标准数字格式字符串
    总目录前言当前文章为C#中的格式设置(格式化字符串)大全中的一个小章节。一、概述1.基本信息标准数字格式字符串用于格式化通用数值类型。标准数字格式字符串采用[formatspecifier][precisionspecifier]的形式formatspecifier格式说明符,负责指定数字......
  • leetcode 213. 打家劫舍 II
    213.打家劫舍II与  198.打家劫舍  相比,多了首和尾不能同时偷的条件但是没写出来......
  • 【大屏信息可视化】零代码轻松构建数字大屏应用-以智慧城市大屏为例
    1引言当我们谈论数字信息的呈现,我们或许习惯于复杂的数据报告和难以捉摸的图表。然而,数字大屏的出现彻底颠覆了这一传统观念。作为现代数据可视化的杰出代表,无论是企业的运营状况、市场的动态趋势,还是城市的发展脉搏,数字大屏都能够为我们提供直观、清晰的视觉体验。以下图中......
  • 工业4.0是生产的革命,数字孪生是工业4.0的革命
    工业4.0掀起了生产模式的巨大变革,推动制造业向智能化、自动化迈进。而数字孪生堪称工业4.0进程中的又一次重大革命。它通过创建物理实体的虚拟模型,实现了物理世界与数字世界的精准映射与实时交互。在产品设计阶段,可提前模拟优化;在生产过程中,能实时监控、预测故障并调整策略......
  • 资料DRV8210PDSGR 12V 电机驱动器、THGBMJG6C1LBAB7 高性能e-MMC存储器、LAN7800-I/Y9
    DRV8210PDSGR12V、1AH桥电机驱动器说明:DRV8210P是一款集成电机驱动器,具有4个N沟道功率FET、电荷泵稳压器和保护电路。三倍电荷泵架构允许该器件在低至1.65V的电压下工作,以适应1.8V电源轨和低电池条件。电荷泵集成了所有电容器,以减小PCB上电机驱动器的整体解决方......
  • 代码随想录——动态规划14最后一块石头的重量II(01背包)
    思路尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。背包问题:dp定义:dp[i]表示在容量为i的背包最多可放下重量为dp[i]的石头递推公式:dp[i]=max(dp[i],dp[i-stones[i]]+stones[i]),要么不选当前的石头(沿用遍历上一个石头的情况),要么选当前的石......
  • SAP财务软件:高效且精准,助力企业实现财务数字化转型
     在当今数据驱动的时代,企业在财务管理上面临着前所未有的挑战与机遇。高效、准确地处理财务数据、优化业务流程以及降低财务风险。作为全球领先的企业管理系统解决方案提供商,SAP财务软件凭借其精准、高效和透明的特点,越来越成为众多企业进行财务数字化转型的首选工具。 SAP财......
  • 使用js写一个方法随机从1–100之间取8个数字并排序
    你可以使用JavaScript的Array,Math.random()和sort()方法来实现这个功能。以下是一个简单的实现:functiongetRandomNumbersAndSort(){//创建一个空数组letarr=[];//使用while循环来确保数组中有8个唯一的数字while(arr.length<8){//生成......
  • 使用 Julia英文数字验证码识别
    验证码(CAPTCHA)被广泛应用于区分用户和自动化程序的任务。许多在线服务都使用验证码来防止恶意程序的干扰。英文数字验证码通常由扭曲的字母和数字构成,旨在提高计算机视觉系统的识别难度。为了自动化地识别这些验证码,我们可以利用Julia语言,结合计算机视觉库来实现验证码识别。在......