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

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

题目:只出现一次的数字II

  • 题号:137
  • 难度:中等
  • https://leetcode-cn.com/problems/single-number-ii/

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

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

示例 1:

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

示例 2:

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

提示:

  • 1<=nums.length<=3∗1041 <= nums.length <= 3 * 10^41<=nums.length<=3∗104
  • −231<=nums[i]<=231−1-2^{31} <= nums[i] <= 2^{31} - 1−231<=nums[i]<=231−1
  • nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

实现

第一种:累加法

原理:[a,a,a,b,b,b,c,c,c]和[a,a,a,b,b,b,c]差了2c。

即 3*(a+b+c)-(a+a+a+b+b+b+c)=2c

所以,唯一的数是c/2。想法很简单,但提交的时候溢出了。

C# 语言

public class Solution
{
    public int SingleNumber(int[] nums)
    {
        int s = nums.GroupBy(a => a).ToList().Sum(a => a.Key) * 3;
        int result = s - nums.Sum(a => a); // System.OverflowException
        return result / 2;
    }
}

第二种:利用字典的方式

把字典当作一个存储容器,key 存储数组中的数字,value 存储该数字出现的频数。

C# 语言

public class Solution
{
    public int SingleNumber(int[] nums)
    {
        Dictionary<int, int> dict = new Dictionary<int, int>();
        for (int i = 0; i < nums.Length; i++)
        {
            if (dict.ContainsKey(nums[i]))
            {
                dict[nums[i]]++;
            }
            else
            {
                dict.Add(nums[i], 1);
            }
        }
        return dict.Single(a => a.Value == 1).Key;
    }
}

Python 语言

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        dic = dict()
        for num in nums:
            if num in dic:
                dic[num] += 1
            else:
                dic[num] = 1

        for k, v in dic.items():
            if v == 1:
                return k
        return -1

第三种:利用位运算

思路:

初始result = 0,将每个数想象成 32 位的二进制,对于每一位的二进制的1累加起来必然是3N或者3N + 1(出现3次和1次);3N代表目标值在这一位没贡献,3N + 1代表目标值在这一位有贡献(=1),然后将所有有贡献的位记录到result中。这样做的好处是如果题目改成k个一样,只需要把代码改成count % k即可,很通用并列去找每一位。

C# 语言

public class Solution
{
    public int SingleNumber(int[] nums)
    {
        int result = 0;
        for (int i = 0; i < 32; i++)
        {
            int mask = 1 << i;
            int count = 0;
            for (int j = 0; j < nums.Length; j++)
            {
                if ((nums[j] & mask) != 0)
                { //该位为1才 !=0
                    count++;  //该位1出现的次数
                }
            }
            if (count % 3 != 0)
            {
                result |= mask;
            }
        }
        return result;
    }
}

Python 语言

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        result = 0
        for i in range(32):
            mask = 1 << i
            count = 0
            for num in nums:
                if num & mask != 0:
                    count += 1
            if count % 3 != 0:
                result |= mask
            if result > 2 ** 31-1:
                result -= 2 ** 32
        return result

注意:Python的整型方便是方便了,但是由于其没有最大值,所以,当输出是负数的时候,会导致认为是正数!因为它把32位有符号整型认为成了无符号整型,所以这就是Python的一个坑。

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.Single Number II(只出现一次的数 II)

题目 LeetCode: 137. Single Number II 力扣: 137. 只出现一次的数字 II Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one. 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。 Note: Your

TomAndersen的博客 835

人形机器人专题:人形机器人关节,从Optimus选型看关节的发展

今天分享的是深度研究报告:《(报告出品方:中泰页。

GPT20236688的博客 3224

LeetCode-第137题-只出现一次的数||

LeetCode-第137题-只出现一次的数||

weixin_67854013的博客 471

2023东华大学机试OJ进阶版1-81题

先排序。每次找两个最小的数,把其中一个置为两数之和,并累加这个和值,另一个数置为-1,然后再排序,重复操作,直到只剩下一个数。105。

m0_49263811的博客 2795

maya权重拷贝一对一,一对多

是不是有时候盔甲很多很碎头很大,用代理一个个拷贝很麻烦吧 用下面代码直接运行进行一对多或者一对一拷贝 第一个先选择参考物体,加选其他一堆有的没的有权重或没权重的物体执行一键拷贝,就可以啦 以下是源码送上,带走吧 ------------------------ #! -*- coding:utf -8 -*- #author:liubingdong #date:20...

weixin_30852367的博客 1532

leetCode 137. 只出现一次的数字 II + 位运算 + 模3加法器 + 真值表(数字电路) + 有限状态机

统计数组中每个元素的出现次数,对于哈希映射中的每个键值对,键表示一个元素,值表示其出现的次数。在统计完成后,遍历哈希映射即可找出只出现一次的元素。这三个状态,但是一个比特位只能表示两个状态,怎么办呢?此时我们可以扩展一个比特,即用两个比特来保存位计数器的三个状态。一样,同样考虑一个比特位的情况,这里需要对这个比特进行计数到 3 时归 0,也就是说需要一个。但是没有现成的加法器,那么需要自己构造一个能位运算的。当前遍历过的所有整数的第 i 位之和除以3的余数。存储当前遍历过的所有整数,当遍历到一个新的整数。

呵呵哒!的博客 1500

VIVADO网表文件DCP和EDF

为了便于模块化设计,同时保护自己的知识产权,Xilinx VIVADO 提供两种代码封装方法:DCP文件和edf文件。

u014035968的博客 1万+

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

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

qq_40263592的博客 1254

锂电池寿命预测 | Python实现基于LSTM长短期记忆神经网络的锂电池寿命预测

锂电池寿命预测 | Python实现基于LSTM长短期记忆神经网络的锂电池寿命预测

算法如诗的博客 1902

ComfyUI 汉化教程(中文界面)

如果你对翻译的结果不满意,还可以进行修改。首先,进入目录,可以看到该目录中有很多 JSON 文件:打开 JSON 文件,找到要修改的内容,修改对应的Value值即可:最后,重启 ComfyUI 即可。

水滴的博客 1万+

只出现一次的数字 II

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,3,2] 输出: 3 示例2: 输入: [0,1,0,1,0,1,99] 输出: 99 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/p...

weixin_41791402的博客 203

【附代码】SSVEP解码算法 - 扩展典型相关分析(eCCA)

本文主要对SSVEP解码算法-eCCA进行复现和测试。本文提供程序的所有代码,只要在Matlab上即可运行。读者可以根据程序自主调整,方便学习以及初学者更好地了解SSVEP的经典算法。

计算机小白 1334

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

目录题目解题思路Code运行结果 题目 137. 只出现一次的数字 II 给你一个整数数组 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 中,除某个

Kinght_123的博客 364

基于STM32L4XX 、HAL库的ATD5984步进电机驱动器驱动程序应用设计

一、简介: ATD5984是一款内部集成了译码器的微特步进电机 驱动器,能使双极步进电机以全、半、1/4、/1/8、1/16 和1/32步进模式工作。步进模式由逻辑输入管脚MSx选 择。其输出驱动能力达到28V±1.6A。 译码器是ATD5984易于使用的关键,通过STEP管脚 输入一个脉冲就可以使电机完成一次步进,省去了相序 表,高频控制线及复杂的编程接口,使其更适于没有复 杂的微处理器或微处理器负担过重的场合。 在步进操作期间,ATD5984的内部电路可以自动

PP_Cottage的博客 406

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【LeetCode】第137题——只出现一次的数字 II(难度:中等)

【LeetCode】第137题——只出现一次的数字 II(难度:中等)题目描述解题思路代码详解注意点 题目描述 给你一个整数数组 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] &lt

Se7en_Dayz的博客 193

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

力扣第137题:只出现一次的数字 II C语言解法

这道题通过使用位运算的技巧(特别是与、异或和位清除操作),我们能够高效地找出只出现一次的数字。相比于哈希表等常规方法,位运算不仅能实现线性时间复杂度,而且能够节省空间,解决了题目中关于额外空间的限制。

weixin_48941116的博客 1245

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

(ง •̀_•́)ง 4029

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

哈希映射、双指针

分享简单技术,记录点滴成长 335

137. 只出现一次的数字 II

LeetCode 第 137 题“只出现一次的数字 II”:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。本题属于位运算相关问题。由于需要在众多重复三次的元素中找出仅出现一次的元素,可利用位运算的特性对每个元素的二进制位进行统计和处理,从而找出目标元素。函数,它接受一个整数数组和数组的大小作为参数,通过统计每一位上 1 出现的次数找出只出现一次的数字并返回。主函数中创建了一个测试数组,调用。在这个代码中,我们定义了。

qq_40844444的博客 1078

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

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

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

shuibuxingaaa的博客 993

Leetcode—137.只出现一次的数字II【中等】

这一题还可以继续扩展,在数组中每个元素都出现 5 次,找出只出现 1 次的数。思路还是一样的,模拟一个五进制,5 次就会消除。为什么要用unsigned int呢,因为或左移溢出报错,例如,左移的高位如果超过符号位,就会报错。因此要用类型强制转换来。参考的是这两位大佬的博客,一个是。

Atticus的博客 559

LeetCode题解:137.只出现一次的数字 II

只出现一次的数字 II 一、LeetCode题解 瞧一瞧(求star!) LeetCode题解Javascript版本:Gitbook版本传送门 LeetCode题解Javascript版本:优快云传送门 前端进阶笔记:Gitbook传送门 二、算法题 题目 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,3,2] 输出: 3 示例 2:

余光的博客 1849

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

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

wind_liang的博客 1162

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简单:27. 移除元素
下一篇: Leetcode中等:5. 最长回文子串
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程小助手_Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值