​【LeetCode】137. 只出现一次的数字 II​

LeetCode 137. 只出现一次的数字 II LeetCode 137. 只出现一次的数字 II 题目链接 这题起初根本想不到.直到翻了leetcode.com的discuss…..然后我整个人都”awesome!!!!”地瞎叫了. 下面讲讲我学来的思路. 这题本质上来讲,就是让我们做一个有限状态机(finite state machine)(瞎翻的). 首先 一般看到这种题,我们第一反应是做状态记录,比如数字x出现了y次.然后... 阅读详情

一、题目信息

  • 比特位计数

  • https://leetcode.cn/problems/single-number-ii/description/

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1:
输入:nums = [2,2,3,2]
输出:3

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

提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

二、题解1:朴素解法

1、解题思路:map计数法

  • 使用map数据结构记录每个数字出现的次数,其中key为数字num,value为该数字出现的次数count

  • 最后找出count为1对应的key值

2、图解

3、代码实现

int singleNumber(vector<int> &nums)
{
  // 创建一个32长度的int数组
  std::map<int, int> map;
  int res = 0;

  // 对数组中每个数字,都去找到他们二进制对应32个位置的数值,并累加起来
  for (int i = 0; i < nums.size(); i++)
  {
    int num = nums[i];
    if (map.find(num) == map.end()) // 不存在
    {
      map[num] = 1;
    }
    else
    {
      map[num] = map[num] + 1;
    }
  }

  for (auto it : map)
  {
    if (it.second == 1)
    {
      return it.first;
    }
  }
  return res;
}

4、时间复杂度

  • NlogN ,底层数据结构使用的是map,通过map进行数据的插入与查询,他的时间复杂度为NlogN

三、题解2:位运算累加和

1、解题思路

  • 遍历数组中的每个数字,获取数字对应二进制位置的值,并累加到一个int[32]数组中去,

  • 接着对每个位置的二进制个数与3取余数,最后得到的二进制就是那个单独出现的数字

2、图解

3、代码实现

int singleNumber(vector<int> &nums)
{
  // 创建一个32长度的int数组
  vector<int> arr(32, 0);
  int res = 0;

  // 对数组中每个数字,都去找到他们二进制对应32个位置的数值,并累加起来
  for (int i = 0; i < nums.size(); i++)
  {
    int num = nums[i];
    for (int j = 0; j < 32; j++)
    {
      arr[32 - j - 1] += (num >> j) & 1;
    }
  }

  // 取出32位数组中每个位置的二进制累加和,与3相除取余数,
  for (int j = 0; j < 32; j++)
  {
    res = (res << 1) + (arr[j] % 3);
  }

  return res;
}

4、时间复杂度

  • N

LeetCode137——只出现一次的数字II 我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/single-number-ii/description/ 题目描述: 知识点:位运算 思路:位运算 本题是LeetCode136——只出现一次的数字的加强版,下述解法讨论均参考于Detailed expl... 阅读详情

相关推荐

【中等】力扣算法题解析LeetCode137:只出现一次的数字 II

题目要求在整数数组 nums 中,找出唯一一个出现一次的元素(其余元素均出现三次)。需设计线性时间、常数空间的算法。核心思想是利用位运算模拟三进制计数,通过状态机记录每位出现1的次数(模3)。定义 ones 和 twos 分别表示某位出现1次和2次的状态,通过位运算实现状态转移。最终 ones 即为只出现一次的数。Java代码通过遍历数组,更新 ones 和 twos,返回 ones。该方法高效且满足题目要求。

ylumwd的博客 520

LeetCode 力扣 137. 只出现一次的数字 II

题目描述(中等难度) 136 题 的升级版,这个题的话意思是,每个数字都出现了 3 次,只有一个数字出现了 1 次,找出这个数字。同样要求时间复杂度为 O(n),空间复杂度为 O(1)。 大家可以先看一下 136 题 ,完全按 136 题 的每个解法去考虑一下。 解法一 先不考虑空间复杂度,用最常规的方法。 可以用一个 HashMap 对每个数字进行计数,然后返回数量为 1 的数字就可以了...

wind_liang的博客 1162

量化交易新手入门:从零开始搭建你的第一个Python交易策略(附完整代码)

本文为量化交易新手提供从零开始搭建Python双均线策略的完整指南,涵盖环境配置、数据获取、策略实现及风险管理等关键步骤。通过详细的代码示例和实践建议,帮助读者快速掌握量化交易的核心技术,并避免常见陷阱。文章特别强调Python在量化交易中的技术革新优势,适合希望进入金融科技领域的初学者。

weixin_26905487的博客 443

LeetCode第137题_只出现一次的数字II

给你一个整数数组nums,除某个元素仅出现外,其余每个元素都恰出现。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且不使用额外空间来解决此问题。

qq_40263592的博客 1254

抖音__NS_sig3签名机制解析与动态Hook实战

在现代移动应用中,客户端与服务端之间的可信通信契约往往依赖于动态生成的请求签名,如抖音(某手)的__NS_sig3参数。该签名并非简单哈希,而是融合设备指纹、传感器数据、运行时上下文与轻量加密的综合摘要,体现了‘环境即凭证’的安全设计思想。其核心价值在于抵御静态伪造与批量模拟,提升接口调用的真实性与不可复用性。典型应用场景包括Feed流加载、点赞关注等关键业务接口的身份校验。本文基于真实逆向与Frida动态Hook实践,深入解析__NS_sig3的so层实现逻辑、JNI调用链路、输入参数真实性验证机制,以及

weixin_30127995的博客 374

保姆级避坑指南:在Ubuntu 22.04上从零编译Autoware.universe(含ROS2 Humble和CUDA配置)

本文提供了一份详细的Autoware.universe编译指南,涵盖Ubuntu 22.04系统优化、ROS2 Humble安装避坑、CUDA配置及Demo运行技巧。通过分步操作和实战经验,帮助开发者高效完成环境搭建,避免常见错误,提升自动驾驶开发效率。

weixin_30642561的博客 347

Leetcode 137. 只出现一次的数字 II C++

Leetcode 137. 只出现一次的数字 II 题目 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。 测试样例 示例 1: 输入: [2,2,3,2] 输出: 3 示例 2: 输入: [0,1,0,1,0,1,99] 输出: 99 题解 因为其余数都是出现3次,因此我们统计所有数字中每个位中1出现的总数,我们再对这个数%3得到的结果就是出现1次的那个数字在该位上的值。详细过程见代码 代码 int singleNumber(vector<

weixin_43750513的博客 224

声纹识别初学

最近开始关注声纹识别技术,发现国内做这个的确实没有几家,而且大多重点推声纹认证,用在公安司法金融领域,而我却关注文本无关的声纹识别,这里把我搜到的一点资料汇总在此. 发现njustzj001的专栏有两篇文章适合入门的我,贴下链接: 综述:  http://blog.csdn.net/xmu_jupiter/article/details/47209961 PLDA解释:  http://

u013452331的专栏 2758

golang力扣leetcode 137.只出现一次的数字II

137.只出现一次的数字II137.只出现一次的数字II题解代码 137.只出现一次的数字II 137.只出现一次的数字II 题解 思路:对于出现三次的数字,各 二进制位 出现的次数都是 33 的倍数。因此,统计所有数字的各二进制位中 11 的出现次数,并对 33 求余,结果则为只出现一次的数字。 代码 package main func singleNumber(nums []int) int { var result int for i := 0; i < 64; i++ { sum

清风 506

【Arc GIS 零基础教学】土地利用类型图的绘制方法

​Hi,我是胡学长!今天教大家怎么利用Arc GIS 绘制土地利用类型图。土地利用类型图是表达土地资源的利用现状、地域差异和分类的专题地图。它是研究土地利用的重要工具和基础资料,同时也是土地利用调查研究的主要成果之一。在编制土地利用图的基础上,对当前利用的合理程度和存在的问题、进一步利用的潜力、合理利用的方向和途径,进行综合分析和评价。因此,土地利用图是调整土地利用结构,因地制宜进行农业、工矿业和交通布局、城镇建设、区域规划、国土整治、农业区划等的一项重要科学依据。......

一起来交流学习吧 1万+

AndroidKiller之APK 编译失败,无法继续下一步签名【BUG解决】【App反向解析】

文章目录项目场景:问题描述原因分析:解决方案:BUG解决 项目场景: AndroidKiller: 在反向解析APP包时报错:APK 编译失败,无法继续下一步签名。 网上很多方法都是无效的哈,我追究原因发现,这个bug的出现大部分情况都是因为Apktool的问题。 此方法:百分之百解决此bug! 错误如下: 问题描述 APK 编译失败,无法继续下一步签名! 原因分析: Apktool版本不适配的问题,现在的技术更新换代太快,我们安装AndroidKiller的时候,有时候不是官方渠道的话,他的版本是非常

一键难忘的博客 2万+

Leetcode 137 Single Number II 仅出现一次的数字

给出一个整数数组,除了某个元素外所有元素都出现三次。找出仅出现一次的数字。

(ง •̀_•́)ง 4029

军品研制过程评审活动-(一)论证阶段

军品研制过程评审活动-(一)论证阶段

Abel的博客 3815

LeetCode137-只出现一次的数字 II

这是今天写的第二篇文章 好像该说的话都在上一篇文章里说了 现在还不知道该说些什么了哈哈哈哈尴尬 等会儿写完了再去看看卢姥爷的斗地主视频 真的是每次看都能笑死我 尤其是那个把东施效颦念成了东施效“鳖” 哈哈哈哈哈要不是开挂事件 我还真的天天去看卢姥爷的直播去了 137-只出现一次的数字 II 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现...

飞奔的菜猪的博客 191

假新闻检测论文分享(30)MMDFND: Multi-modal Multi-Domain Fake News Detection

现有的假新闻检测方法通常集中在单一领域的新闻上,如健康或政治。然而,社交媒体上的新闻往往来自多个领域,这给单一领域的假新闻检测方法带来了两个主要挑战:数据稀缺性:处理较小、单一领域的新闻数据集时,由于训练数据的稀缺,模型的有效性显著下降。跨领域检测的准确性下降:单一领域的假新闻检测方法在跨领域新闻数据集上的准确性大幅降低。缓解领域间模态语义偏差:通过DPLE网络提取跨领域和领域特定的知识,缓解了不同领域间文本和图像的语义差异。

weixin_41964296的博客 669

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

5.4 位运算专题:LeetCode 137. 只出现一次的数字 II

LeetCode 137. 只出现一次的数字 II:位运算的优雅解法

shuibuxingaaa的博客 993

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode 137 只出现一次的数字 II

LeetCode 137 只出现一次的数字 II 虽然要求不开辟额外空间与O(n)的时间复杂度, 单由于数据比较水. 靠排序依然能过, 所以花了点时间想了想 数字去重, 时间复杂度O(n)且不开辟额外空间, 那么就该从位运算入手了 某个元素只出现一次, 其余每个元素出现3个, 则把每一个数字拆分为二进制, 经过拆分求和之后每一位上只有3x或3x + 1, 经过%3后就完成了去重工作 由...

259

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

力扣题目——137. 只出现一次的数字 II

2、ans不符合上述情况时,ans就只能在nums中间某位置,遍历nums数组,如果遇到三个相邻的不同的数,则ans就是三个数中间的那个数。1、利用map容器记录每种数字出现的次数,为了减少时间成本,可以采用无须排序的unordered_map容器进行存储。2、对数组进行遍历,统计每种数字的个数,循环判断哪个数字的个数为1,直接返回即可。1、判断边界条件:一种是nums的大小为1,那答案ans就是nums[0];另一种是判断ans是否位于数组nums的首尾位置。请你找出并返回那个只出现了一次的元素。

Asddgdgkk的博客 393

LeetCode 137. 只出现一次的数字 II(Single Number II)

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

weixin_30399155的博客 109

leetcode 137 只出现一次的数字II

就可以还原出只出现一次的数,返回这个修改完成的数即为所求。时间复杂度:T(n)=O(n)空间复杂度:S(n)=O(1)的思想来解决这个问题。通过枚举我们可以发现,

2301_80296866的博客 415

Leetcode中等:137. 只出现一次的数字II

注意:Python的整型方便是方便了,但是由于其没有最大值,所以,当输出是负数的时候,会导致认为是正数!因为它把32位有符号整型认为成了无符号整型,所以这就是Python的一个坑。,将每个数想象成 32 位的二进制,对于每一位的二进制的1累加起来必然是。你必须设计并实现线性时间复杂度的算法且不使用额外空间来解决此问题。代表目标值在这一位有贡献(=1),然后将所有有贡献的位记录到。请你找出并返回那个只出现了一次的元素。想法很简单,但提交的时候溢出了。即可,很通用并列去找每一位。存储该数字出现的频数。

老马的程序人生 894

LeetCode第 137 题:只出现一次的数字II(C++)

137. 只出现一次的数字 II - 力扣(LeetCode) 这题的进阶:LeetCode第 136 题:只出现一次的数字(C++)_zj-优快云博客 哈希表 class Solution { public: int singleNumber(vector<int>& nums) { unordered_map<int, int> m; for(int i = 0; i < nums.size(); ++i)

zj 657

Leetcode-137. 只出现一次的数字 II (python3实现)

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

康雨城 1274

Leetcode :137. 只出现一次的数字 II(位运算)

137. 只出现一次的数字 II 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,3,2] 输出: 3 示例 2: 输入: [0,1,0,1,0,1,99] 输出: 99 通过次数30,821提交次数46,020 解法太狠了,建议自己去leetcode上看详解 这里只是记录我对大佬的钦佩之情 class Solution { publi

stackempty2的博客 196

Leetcode 137. 只出现一次的数字 II

【代码】Leetcode 137. 只出现一次的数字 II。

JehanRio's Private Blog 296
上一篇: 【LeetCode】338、比特位计数
下一篇: 【LeetCode】 318. 最大单词长度乘积
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值