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.mzph.cn/news/241282.shtml

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

相关文章

使用函数式接口对代码简化,完成代码重复性使用

📚目录 📚简介💨优化前原代码:⚙️ 函数编程简化🎄 JDK自带的函数式接口✨ 改造调用方式🎊 时间范围执行🎉时间范围每天执行 📚简介 因为公司的使用Xxl-Job作为任务调度平台,其中我们大部分的报…

camera同步信号

基本概念 PCLK:pixel clock是像素点同步时钟信号, 主频。也就是每个PCLK对应一个像素点。 HSYNC:horizonal synchronization是行同步信号,水平同步信号。就是在告诉接收端:“HSYNC”有效时段内接收端接收到的所有的信号输出属同…

系列二十八、如何在Oracle官网下载JDK的api文档

一、官网下载JDK的api文档 1.1、官网地址 https://www.oracle.com/java/technologies/javase-jdk21-doc-downloads.html 1.2、我分享的api.chm 链接:https://pan.baidu.com/s/1Bf55Fz-eMTErmQDtZZcewQ?pwdyyds 提取码:yyds 1.3、参考 https://ww…

C语言——高精度除法

一、引子 1、引言 高精度除法相较于加减乘法更加复杂,它需要处理的因素更多,在这里我们先探讨高精度数除以低精度数,即大数除小数。这已满足日常所需,如需大数除以大数,可以使用专门的库,例如&#xff1a…

Angular 11到升级到 Angular 16

日新月异,与时俱进… 随着Angular版本不断更新,再看所开发的项目版本仍然是Angular 11,于是准备升级 截止发博日最版本是 v17.1.0,考虑到稳定性因素决定升级到v16版本 一:查看 升级指南 二:按照指南&…

推荐算法架构7:特征工程(吊打面试官,史上最全!)

系列文章,请多关注 推荐算法架构1:召回 推荐算法架构2:粗排 推荐算法架构3:精排 推荐算法架构4:重排 推荐算法架构5:全链路专项优化 推荐算法架构6:数据样本 推荐算法架构7:特…

数据校园服务管理系统,教育平台可视化界面(教育资源信息化PS文件)

大屏组件可以让UI设计师的工作更加便捷,使其更高效快速的完成设计任务。现分享大数据校园服务管理系统、科技教育平台大数据可视化界面、教育资源信息化大数据分析等Photoshop源文件,文末提供完整资料,供UI设计师们工作使用。 若需其他 大屏…

Linux一行命令配置jdk环境

使用方法: 压缩包上传 到/opt, 更换命令中对应的jdk包名即可。 注意点:jdk-8u151-linux-x64.tar.gz 解压后名字是jdk1.8.0_151 sudo tar -zxvf jdk-8u151-linux-x64.tar.gz -C /opt && echo export JAVA_HOME/opt/jdk1.8.0_151 | sudo tee -a …

unity中使用protobuf工具将proto文件转为C#实体脚本

unity中使用protobuf工具将proto文件转为C#实体脚本 介绍优点缺点Protobuf 为什么比 XML 快得多?Protobuf的EncodingProtobuf封解包的过程通常编写一个Google Protocol Buffer应用需要以下几步: Protostuff是什么Protobuf工具总结 介绍 protobuf也就是G…

Java面向对象(初级)

面向对象编程(基础) 面向对象编程(OOP)是一种编程范式,它强调程序设计是围绕对象、类和方法构建的。在面向对象编程中,程序被组织为一组对象,这些对象可以互相传递消息。面向对象编程的核心概念包括封装、继承和多态。…

Vue3选项式API和组合式API详解

前言 相信学习Vue3的人中大多数都是之前使用Vue2开发的,当拿到一个Vue3项目时就接触到了组合式api,但对于组合式api不了解的人第一眼看上去会觉得一头雾水。:“什么玩意,乱七八糟的,选项式api多好,方法变量…

Linux bridge开启hairpin模拟测试macvlan vepa模式

看到网上介绍可以通过Linux bridge 开启hairpin方式测试macvlan vepa模式,但是没有找到详细资料。我尝试测试总提示错误信息,无法实现,经过几天的研究,我总算实现模拟测试,记录如下: 参考 1.Linux Macvla…

「Vue3面试系列」Vue3.0性能提升主要是通过哪几方面体现的?

文章目录 一、编译阶段diff算法优化静态提升事件监听缓存SSR优化 二、源码体积三、响应式系统参考文献 一、编译阶段 回顾Vue2,我们知道每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发…

MicroPython的交互式解释器模式 REPL

MicroPython的交互式解释器模式又名REPL(read-eval-print-loop),就是一种命令输入交互模式,跟Python的REPL是类似的,就是在命令行直接输入Python代码或表达式执行并打印结果。关于MicroPython的REPL跟通常的Python类似…

linux运维面试题

linux运维面试题 面试 K8S篇(高可用) Q:k8s是什么?架构? Kubenetes是一个开源的容器集群管理系统。主要用于容器编排,解决容器调度问题。当应用请求时,k8s需要合理分配请求到空闲node节点上去。k8s使用的主从模式&…

python通过JS逆向采集艺恩电影数据, 并制作可视化

嗨喽~大家好呀,这里是魔王呐 ❤ ~! 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 环境使用: 版 本: python 3.10 编辑器:pycharm 2022.3.2 nodejs 模块使用: requests -> pip install requests execjs -> pip install…

【Git】在 IDEA 中合并多个 commit 为一个

文章目录 1 未提交到远程分支1.1 需求说明1.2 reset 操作1.3 再次 push 2 已经提交到远程分支2.1 需求说明2.2 rebase 操作2.3 强制 push 分两种情况: 一种是本地提交还没推到远程,这种好处理另一种是已经提交到远程分支,这个略麻烦 1 未提…

【接口测试】Postman(三)-变量与集合

一、变量 ​ 变量这个概念相信大家都不陌生,因此在这里我们不介绍了。主要说一下在Postman中有哪几类变量,主要包括以下四类: Global(全局) Environment(环境) Local(本地&#xf…

Linux中安装Maven3.6.1

一、安装及配置maven 1.下载maven安装包 首先需要切换到自己需要安装的目录 我自己是把配置都放到了:/usr/local/maven路径下 cd /usr/local/maven 下载maven安装包: wget https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven…

FreeRTOS信号量学习

目录 一、信号量的特性 1. 信号量的常规操作 2. 信号量跟队列的对比 3. 两种信号量的对比 4. 信号量函数 4.1 创建 4.2 删除 4.3 give/take 5. 使用二进制信号量来同步 6. 防止数据丢失 7. 使用计数型信号量 队列(queue)可以用于传输数据:在任务之间、任务和…