【LeetCode 136 137 260】 只出现一次的数字Ⅰ、Ⅱ、Ⅲ (Single Number)

算法题 只出现一次的数字Ⅰ/Ⅱ/Ⅲ 136. 只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。思路:本来使用HashMap做,后来才知道这是位运算方面的题,惭愧。           由于其他元素都出现了两次,因此把全部元素亦或一下,结果就出来了。。class Solution { public static int singleNumber(int[] ... 阅读详情

LeetCode 第136、137、260刚好都是同一类型的题目:只出现一次的数字,放在一起进行整理

136. 只出现一次的数字Ⅰ

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

  • 示例 1:
    输入: [2,2,1]
    输出: 1
  • 示例 2:
    输入: [4,1,2,1,2]
    输出: 4

思路:这道题比较简单,相同的数可以用异或的方式处理掉,比如 a ^ a = 0,所以我们可以对数组内的所有数进行异或操作,每对相同的数被抵消,只剩下唯一那个只出现一次的元素

	public int singleNumber(int[] nums) {
        // 对输入进行判断
        if (nums == null) {
            return 0;
        }
        int output = 0;
        // 遍历整个数组,进行异或处理
        for (int a : nums
                ) {
            output ^= a;
        }
        return output;
    }

137. 只出现一次的数字Ⅱ

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

  • 示例 1:
    输入: [2,2,3,2]
    输出: 3
  • 示例 2:
    输入: [0,1,0,1,0,1,99]
    输出: 99

思路:这里提供三种思路
① 利用HashSet,遍历整个数组,将整个数组存入HashSet中,相当于重复的部分被删除了,计算有setSum(一套重复数字+只出现了一次的数),再计算整个数组所有元素的和totalSum(三套重复数字+只出现了一次的数),通过(setSum*3-totalSum)/2。这种思路的代码:

	private static int singleNubmer1(int[] A) {
        if (A == null) {
            return 0;
        }
        Set<Integer> set = new HashSet<>(A.length);
        int totalSum = 0, setSum = 0;
        for (int a : A
             ) {
            totalSum += a;
            if (!set.contains(a)) {
                set.add(a);
                setSum += a;
            }
        }
        return (setSum * 3 - totalSum) / 2;
    }

但这种方法不适合于JAVA,因为在求和的过程中,可能因为数字太大,超过了Integer.MAX_VALUE,而出现异常。这种思路可以用于python语言进行实现。而在一开始,指定了hashset的初始容量后,可以将整个算法的复杂度约为O(n),但空间复杂度较大

② 将所有数的同一位进行相加,再对3进行取余,重复的数字会因为对3取余而被抵消掉,剩下的数即为不重复的数

    private static int singleNumber(int[] A) {
        int result = 0;
        // 遍历Integer的每一位
        for (int i = 0; i < 32; i++){
            int temp = 0;
            // 遍历每个数的同一位
            for (int a : A) {
                temp += (a>>i & 1);
            }
            // 对3取余
            result |= ((temp % 3) << i);
        }
        return result;
    }

这种做法时间复杂度为O(n),下面是在leetcode官网提交的结果,还算是比较好的一种解法
在这里插入图片描述

③ 后面突然搜到了别人的另外一种做法:
https://blog.youkuaiyun.com/i_am_bird/article/details/78160627

	private static int singleNumber2(int[] A) {
        //记录只出现过1次的bits
        int ones = 0;
        //记录只出现过2次的bits
        int twos = 0;
        // 记录出现过3次的bits
        int threes;
        // 遍历所有数
        for (int i : A
             ) {
            // 通过现在的数跟出现一次的数进行并运算,找出出现了两次的数
            twos |= ones & i;
            // 除去出现了一次的数中当前的数
            ones ^= i;
            // 如果在出现两次中出现了,还在出现一次中出现,则说明出现了三次
            threes = ones & twos;
            // 将出现三次的情况在记录只出现过1次的bits中除去
            ones &= ~threes;
            // 将出现三次的情况在记录只出现过2次的bits中除去
            twos &= ~threes;
        }
        // 返回只出现一次的bits,即没有重复的数
        return ones;
    }

在leetcode官网提交的结果:
在这里插入图片描述

260. 只出现一次的数字Ⅲ

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

  • 示例 :
    输入: [1,2,1,3,2,5]
    输出: [3,5]
    注意:
    结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
    你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

思路:
参考只出现一次的数字Ⅰ,对所有数进行异或操作,可以获得两个没有重复的数a、b的异或操作的结果。
因为a、b是不同的数,则他们异或的结果一定至少存在一个1,找出其中的一个1,记为c。
重新遍历数组,如果每个数跟c取与操作,如果相同,则归入集合A,如果不同则归入集合B,我们可知,集合A里面有一个不重复的数,和成对的其他重复的数,集合B里有另外一个重复的数,和成对的其他重复的数。相当于问题转为两个求只出现一次的数字Ⅰ的问题

这里举一个具体的例子解释一下:{1,1,2,2,3,5,8,5,8,10}
其中不同的元素为:3(0011),10(1010)
对整个数组进行异或操作,最后只剩下3跟10进行异或操作:1001
我们可以通过获取其中的一个1,例如 c = 0001
我们重新遍历整个数组,每个数与c进行与操作,判断是否为0,可以将数组分成:
与为0:{2,2,8,8,10} 与为1:{1,1,3,5,5}
刚好将两个不同的数字分开,且将重复的数字分到了相同的集合中,再对每个集合进行异或操作,即可以获得不同的数字

	public int[] singleNumber(int[] nums) {
        int a = 0;
        // 对整个数组进行异或操作
        for (int i : nums
             ) {
            a ^= i;
        }
        // 取一位1
        a &= -a;
        int[] result = new int[2];
        // 重新遍历数组,将数组进行分组
        for (int i : nums
             ) {
            if ((i & a) == 0) {
                result[0] ^= i;
            } else {0
                result[1] ^= i;
            }
        }
        return result;
    }

Leetcode官网运行结果:
在这里插入图片描述
其他 LeetCode 题目解析

Claude Code 接入 DeepSeek-V4 教程 本文介绍Claude Code的安装配置流程:1) 安装Node.js 18+和Git(Windows);2) 通过npm全局安装@anthropic-ai/claude-code;3) 配置DeepSeek API环境变量(需替换API Key);4) 启动Claude Code或配置VSCode插件。重点包括Linux/macOS和Windows的环境变量设置方法,以及VSCode插件的settings.json配置项。完成配置后即可在终端或VSCode中使用Claude Code功能。 阅读详情

相关推荐

STM32F103 串口DMA + 空闲中断 实现不定长数据收发

文章目录1. 空闲中断1.1 uart_dma.c1.2 uart_dma.h1.3 main.c1.4 stm32f10x_it.c1.5 效果演示1.6 知识补充1.6.1 外设的基地址     DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU

夏夜晚风_的博客 3万+

【Leetcode】137.只出现一次的数字(逻辑运算推导)

题目链接 点击打开链接 题目描述 解题思路 首先我们分析一下题意,一个数组中只有一个数出现了1次,其余的数都出现了3次。并且要求O(n)O(n)O(n)的时间复杂度和O(1)O(1)O(1)的空间复杂度。也就是不能用线性表、HashSet、HashMap这些数据结构了。 解法一 这题还是从二进制位来考虑,分以下2种情况: 如果这个二进制位出现了3n次1(3次、6次、9次等),那么就说明结果在这...

wyg1997 868

当兵心理测试软件,当兵心理测试题及答案

心理测试是一种比较先进的测试方法,它是指通过一系列手段,将人的某些心理特征数量化,来衡量个体心理因素水平和个体心理差异差异的一种科学测量方法。小编为你整理了当兵心理测试题及答案,希望对你有所参考帮助。征兵心理测试题(1代表是2代表否)1、我的胃口很好。12、我早上起来的时候,多半觉得睡眠充足,头脑清醒13、我喜欢看报纸上的犯罪新闻。14、有时我常感到困难重重,无法克服。25、我时常遇见一些所谓的专...

weixin_42128393的博客 1万+

137. 只出现一次的数字 II -详解

题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,3,2] 输出: 3 示例 2: 输入: [0,1,0,1,0,1,99] 输出: 99 解法1 既然是3n+1 的思路,用 set 去重之后,*3 减去 不去重直接s...

Leon的博客 1229

分位数映射数据后处理-Quantile Mapping后处理 (R语言)

统计后处理器基本上是统计模型,将观察到的关注变量与从气象或水文模型的直接模型输出(DMO)导出的适当预测变量相关联。统计后处理的重要性早已在气象预报中得到认可。早期的工作包括完善的预测(perfect prognosis),模型输出统计(MOS)和模拟方法(analog method)等模型。 近年来,已经提出了许多其他后处理方法,包括秩直方图校准(rank histogram calibrati...

水滴石穿,绳锯木断 1万+

保姆级教程:在Win10/Win11上搞定AppScan 10.0.0安装与许可证激活(含常见报错解决)

本文提供AppScan 10.0.0在Win10/Win11上的详细安装与许可证激活指南,涵盖环境准备、分步安装、文件替换技巧及常见报错解决方案。通过专业的安全测试工具部署实践,帮助用户高效完成安装并避免常见陷阱,提升Web应用安全扫描效率。

weixin_30800987的博客 424

Leetcode 137:只出现一次的数字 II(最详细的解法!!!)

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,3,2] 输出: 3 示例 2: 输入: [0,1,0,1,0,1,99] 输出: 99 解题思路 这是之前Leetcode 136:只出现一次的数字(最详细的解法!!!)问题的扩展。我...

coordinate的博客 7291

图像质量评估:使用 SSIM 计算图像相似性

在图像处理领域,衡量两幅图像之间相似性的一种常见方法是使用结构相似性指数(SSIM)。SSIM 是一种全参考的图像质量评估指标,它不仅考虑了图像的亮度、对比度,还考虑了结构信息。在本文中,我们将介绍一个使用 Python 和 OpenCV 实现的 SSIM 计算脚本,并使用该脚本评估两幅图像的相似性。

hasque2019的博客 1153

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

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

(ง •̀_•́)ง 4029

如何在 SAP Server Side JavaScript 里消费 destination

在SAP云平台里打开SAP HANA Web-Based Development Workbench进行服务器端JavaScript的开发。 创建一个新的package: 创建一个新的application: 创建一个新的文件google-distance-api.xshttpdest用于维护destination相关信息: host = "maps.googlea...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 611

【YOLOv8改进-注意力机制】BRA(bi-level routing attention ):双层路由注意力

【YOLOv8改进-注意力机制】BRA(bi-level routing attention ):双层路由注意力我们提出了一种新颖的动态稀疏注意力机制,通过双层路由实现更加灵活且具有内容感知的计算分配。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 3166

Single Number Ⅰ Ⅱ III【 leetcode解题报告】

136. Single Number Ⅰ Description Given a non-empty array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexi...

tan_change的专栏 564

关于Fluent模拟中的动态接触角UDF实现,详细设计

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1142

leetcode.136 single-number 力扣.136 只出现一次的数字 位运算

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。异或的性质是:相同的数字异或结果为 0,0 和任何数字异或结果为该数字本身。通过 HashMap 记录每一个元素出现的次数,然后找到为1的。所以异或所有元素,最后的结果就是那个只出现一次的数字。除了某个元素只出现一次以外,其余每个元素均出现两次。因为其他的元素成对出现,那么剩下的就是结果。输入:nums = [4,1,2,1,2]输入:nums = [2,2,1]找出那个只出现了一次的元素。输入:nums = [1]

643

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

翻译给定一个整型数组,除了某个元素外其余的均出现了三次。找出这个元素。备注: 你的算法应该是线性时间复杂度。你可以不用额外的空间来实现它吗?原文Given an array of integers, every element appears three times except for one. Find that single one.Note: Your algorithm should ha

nomasp 5715

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LeetCode 260 Single Number III(只出现一次的数字 III)(*)

原文给定一个数字数组nums,其中有两个元素只出现一次,而其他所有元素均出现两次。找出这两个只出现一次的元素。例如:给定nums = [1, 2, 1, 3, 2, 5],返回[3, 5]。备注: 1, 返回结果的顺序不重要。所以在上例中,返回[3, 5]也是正确的。 2, 你的算法应该运行在线性时间复杂度。你可以只用常量空间复杂度来实现它吗?原文Given an array of numbers

nomasp 6739

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

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

Leetcode 260 Single Number III 仅出现一次的数字

给出一个数组,其中只有两个元素仅出现一次,其余元素均出现两次。找出只出现一次的两个元素。

(ง •̀_•́)ง 1282

LeetCode 136.137. 260.Single Number ⅠII III

LeetCode 136.137. 260.Single Number ⅠII III

Appletable的博客 516

LeetCode 136 Single Number(只出现一次的数字)

翻译给定一个整型数组,除了某个元素外其余元素均出现两次。找出这个只出现一次的元素。备注: 你的算法应该是一个线性时间复杂度。你可以不用额外空间来实现它吗?原文Given an array of integers, every element appears twice except for one. Find that single one.Note: Your algorithm should h

nomasp 5596

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--136. Single Number & 137. Single Number II & 260. Single Number III

题目链接:https://leetcode.com/problems/single-number/、https://leetcode.com/problems/single-number-ii/、https://leetcode.com/problems/single-number-iii/ 思路一:最朴素的思路就是使用哈希算法来做这三条题目,代码都差不多 Single Number 代码: ...

To_be_thinking的博客 170

[leetcode]Single Number

刷微博时看见的一道网易面试题,竟然一点印象都没有,后来才知道是leetcode上面的原题,而且是一个系列的都是关于位运算的。136. Single Number Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorit

paine1690的博客 520

LeetCode 137. Single Number II

欢迎访问原文所在博客:https://52heartz.top/articles/leetcode-137-single-number-ii/ 核心思想 一个 int 型整数有32个二进制位。 对于每个二进制位,统计这一位上1的个数,然后对3取余,如果余数不为0,说明不重复的那个数的这个二进制位为1。 统计每一位上1的个数,通过和二进制1进行位与操作。 如果某个二进制位是1,通过和结果进行 或 ...

user2639的博客 165

LeetCode 260 Single Number III

题目描述Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.For example:Given nums =

Yano_nankai的博客 643

leetcode 137. Single Number II

https://leetcode.com/problems/single-number-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: 要求时...

Bean771606540的博客 300

leetcode 136. Single Number + 137. Single Number II + 260. Single Number III

136. Single Number 题意:给定一个数组,只有一个数出现一次,其余数都出现两次,找出这个单独出现一次的数。 解法一:数学方法,2*(a+b+c)-(a+a+b+b+c) = c 解法二:位运算:a^a = 0 异或操作 from collections import Counter class Solution: def singleNumber(self, nums:...

rainMan的博客 230
上一篇: 【LeetCode 89】格雷编码 构建法和自然二进制编码转化法
下一篇: 【JAVA基础】JAVA 53个关键字总结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值