python算法例23 落单的数Ⅰ

1. 问题描述

给出2n+1个非负整数元素的数组,除其中一个数字之外,其他每个数字均出现两次,找到这个数字。

2. 问题示例

给出[1,2,2,1,3,4,3],返回4。

3. 代码实现

使用异或运算(XOR)实现

def find_single_number(nums):result = 0for num in nums:result ^= numreturn result# 测试示例
nums = [1, 2, 2, 1, 3, 4, 3]
result = find_single_number(nums)
print(result)

该算法的思路是,由于除了一个数字之外,其他数字都出现了两次,所以对数组中的所有数字进行异或运算,最后的结果就是那个只出现一次的数字。异或运算具有以下性质:

  • 任何数与 0 进行异或运算,结果仍然是该数本身。
  • 任何数与自身进行异或运算,结果为 0。

因此,将数组中的所有数字进行异或运算,最后得到的结果就是那个只出现一次的数字。

在示例中,数组 [1, 2, 2, 1, 3, 4, 3] 中所有数字进行异或运算的结果为 4,即为只出现一次的数字。

使用哈希表实现

def find_single_number(nums):hash_table = {}for num in nums:if num in hash_table:hash_table[num] += 1else:hash_table[num] = 1for num, count in hash_table.items():if count == 1:return num# 测试示例
nums = [1, 2, 2, 1, 3]
result = find_single_number(nums)
print(result)

该算法的思路是,使用哈希表记录每个数字出现的次数,然后遍历哈希表找到只出现一次的数字。

在示例中,数组 [1, 2, 2, 1, 3] 中数字 3 只出现了一次,因此返回结果为 3。相比于异或运算的方法,使用哈希表的方法需要额外的空间来存储哈希表,但时间复杂度相同,都为 O(n)。

使用数学方法实现

def find_single_number(nums):return 2 * sum(set(nums)) - sum(nums)# 测试示例
nums = [1, 2, 2, 1, 3, 4, 3]
result = find_single_number(nums)
print(result)

该算法的思路是,先将数组中的所有数字去重得到不重复的数字集合,然后将集合中的数字乘以 2,再减去数组中所有数字的和,最终得到的结果就是只出现一次的数字。

在示例中,数组 [1, 2, 2, 1, 3, 4, 3] 中数字 4 只出现了一次,因此返回结果为 4。相比于异或运算和哈希表的方法,使用数学方法的代码更简洁,但是需要进行额外的数学计算,可能会有一定的精度误差。。

使用集合方法实现

def find_single_number(nums):num_set = set()for num in nums:if num in num_set:num_set.remove(num)else:num_set.add(num)return num_set.pop()# 测试示例
nums = [1, 2, 2, 1, 3, 4, 3]
result = find_single_number(nums)
print(result)

该算法的思路是,使用一个集合来存储出现过一次的数字,遍历数组中的每个数字,如果数字已经在集合中存在,则从集合中移除;否则,将数字添加到集合中。最后,集合中剩下的元素就是只出现一次的数字。

在示例中,数组 [1, 2, 2, 1, 3, 4, 3] 中数字 4 只出现了一次,因此返回结果为 4。相比于其他方法,使用集合的方法不需要进行额外的位运算或数学计算,空间复杂度为 O(n),时间复杂度也为 O(n)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/295112.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins 插件管理指南

目录 常用插件 插件安装 已安装插件 installed plugins 常用插件 Docker Plugin: 这个插件让Jenkins能够与Docker容器平台进行集成。它允许在Jenkins构建过程中创建、管理和销毁Docker容器,为需要Docker化的项目提供了极大的便利性。对于需要在容器中…

2024年【安全生产监管人员】模拟考试题库及安全生产监管人员理论考试

题库来源:安全生产模拟考试一点通公众号小程序 安全生产监管人员模拟考试题库是安全生产模拟考试一点通总题库中生成的一套安全生产监管人员理论考试,安全生产模拟考试一点通上安全生产监管人员作业手机同步练习。2024年【安全生产监管人员】模拟考试题…

php反序列化漏洞原理、利用方法、危害

文章目录 PHP反序列化漏洞1. 什么是PHP反序列化漏洞?2. PHP反序列化如何工作?3. PHP反序列化漏洞是如何利用的?4. PHP反序列化漏洞的危害是什么?5. 如何防止PHP反序列化漏洞?6. PHP反序列化漏洞示例常见例子利用方法PH…

Ubuntu 常用命令之 mkfs 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 mkfs 是在 Linux 和其他 Unix-like 系统中用于创建文件系统的命令。在 Ubuntu 系统中,mkfs 命令也是用于创建文件系统的。mkfs 是一个包装器,它会根据用户指定的文件系统类型调用相应的程序。 mkfs 命令的…

宝塔面板 -- 创建第一个自己的网站

文章目录 前言 一、安装宝塔面板 二、注册宝塔面板 三、安装nginx 四、第一个hello world运行 五、总结 文章目录 前言一、安装宝塔面板二、注册宝塔面板三、安装nginx四、第一个hello world运行五、总结 前言 阿里云最近对在校大学生免费每人赠送一台服务器&#xff0c…

49.网游逆向分析与插件开发-游戏反调试功能的实现-软件调试器设计的基本原理

图0: 下方是一个简化过的代码 做一个软件调试器最基本的是,首先要调试一个进程那么就要有一个进程 拿x96dbg来讲调试一个进程有两种方式,第一种通过附加(如图1),通过附加可以对已经创建的进程进行调试&…

条款7:为多态基类声明虚析构函数

文章目录 虚析构函数声明虚析构函数的情况继承的情况总结 虚析构函数 纪录时间的方法很多,合理的做法是创建一个基类,并为不同的计时方法创建派生类: class TimeKeeper { public:TimeKeeper();~TimeKeeper();... }; class AtomicClock : public TimeKee…

RobotMaster学习——工序导入,参数设置,轨迹生成

目录 引出1.导入工序2.修改刀具其他刀具参数 3.进行工序分配4.设置TCP5.设置工作站6.工序整体导入配置7.进行计算 总结 引出 RobotMaster的操作流程,从导入工序到生产轨迹。 1.导入工序 2.修改刀具 要选择第七把刀具 其他刀具参数 第一把刀具 第二把刀具 第三把刀…

增量式旋转编码器在STM32平台上的应用

背景 旋钮是仪器仪表上一种常见的输入设备,它的内部是一个旋转编码器,知乎上的这篇科普文章对其工作原理做了深入浅出的介绍。 我们公司的功率分析仪的前面板也用到了该类设备,最近前面板的MCU从MSP430切换成了STM32,因此我要将…

linux运维的面试题一

1.linux启动过程 1加电 2加载主板bios设置 3加载多重操作系统启动管理器grub 4加载内核系统到内存当中 5加载配置文件 6加载内核模块 7完成相应的初始化工作和启动相应的服务 8启动系统进程 9出现登录界面 10开机启动完成 2.安装过操作系统吗?怎么安装? 1.小批量设…

Vue+ElementUI+nodejs学生宿舍报修管理系统68ozj

本站是一个B/S模式系统,采用vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得学生宿舍信息管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中…

nodejs+vue+ElementUi美发店理发店管理系统q9xc1

本站是一个B/S模式系统,采用vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得美发门店管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱…