Python算法例36 丑数Ⅱ

1. 问题描述

设计一个算法,找出只含素因子2、3、5的第n小的数,符合条件的数如:1、2、3、4、5、6、8、9、10、12…

2. 问题示例

如果n=9,返回10。

3. 代码实现

def find_nth_number(n):if n <= 0:return Nonenumbers = [1]idx2 = 0  # 索引指向最后一个乘以2的数idx3 = 0  # 索引指向最后一个乘以3的数idx5 = 0  # 索引指向最后一个乘以5的数for _ in range(1, n):next_num = min(numbers[idx2] * 2, numbers[idx3] * 3, numbers[idx5] * 5)numbers.append(next_num)if next_num == numbers[idx2] * 2:idx2 += 1if next_num == numbers[idx3] * 3:idx3 += 1if next_num == numbers[idx5] * 5:idx5 += 1return numbers[-1]
print(find_nth_number(9))  # 输出:10
print(find_nth_number(15))  # 输出:24

上述代码使用“丑数”算法(Ugly Number Algorithm)。

它的核心思想是将数字拆分成若干个质因子的乘积,而这个算法只考虑素因子 2、3、5。具体来说,该算法使用动态规划的思想,维护三个指针 idx2、idx3 和 idx5 分别表示当前已经乘以 2、3、5 的数的索引位置,然后每次取三个指针指向的数中的最小值作为下一个丑数。

具体实现步骤如下:

  1. 定义一个列表 numbers,用于存储已经生成的丑数,初始化为 [1]。
  2. 定义三个指针 idx2、idx3 和 idx5,初始值都为 0。
  3. 从 1 开始循环,依次生成第 2、3、4、...、n 个丑数。
  4. 对于当前要生成的第 i 个丑数,其值等于三个指针指向的数中的最小值,即 min(numbers[idx2] * 2, numbers[idx3] * 3, numbers[idx5] * 5)。
  5. 将上一步生成的数添加到列表 numbers 中。
  6. 如果新生成的数等于 numbers[idx2] * 2,则将指针 idx2 加 1;如果等于 numbers[idx3] * 3,则将指针 idx3 加 1;如果等于 numbers[idx5] * 5,则将指针 idx5 加 1。
  7. 重复步骤 4~6,直到生成第 n 个丑数为止。
  8. 返回列表 numbers 中的最后一个数即为第 n 小的丑数。

这种算法的时间复杂度为 O(n),因为每次需要生成一个新的丑数,而且每个丑数都需要比较三个指针指向的数中的最小值。

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

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

相关文章

Azure Machine Learning - 聊天机器人构建

目录 聊天机器人架构概述消耗成本环境准备打开开发环境部署和运行将聊天应用部署到 Azure使用聊天应用从 PDF 文件获取答案使用聊天应用设置更改答复行为 本文介绍如何部署和运行适用于 Python 的企业聊天应用示例。 此示例使用 Python、Azure OpenAI 服务和 Azure AI 搜索中的…

【playwright】新一代自动化测试神器playwright+python系列课程22_playwright模拟鼠标操作_悬停_右击_双击

playwright模拟鼠标操作_悬停_右击_双击 鼠标悬停 – hover() 有些元素&#xff0c;只有你鼠标移动到它那个位置上&#xff0c;他才会展开或者显示一些内容&#xff0c;这时候就要用到hover()操作了。 以个人设置这个下拉菜单&#xff0c;来看一下hover的使用。 项目实践代…

Spring Boot整合日期转换器(Converter)和拦截器(HandlerInterceptor)

添加日期转换器&#xff08;Converter&#xff09; public class DataConverter implements Converter<String, Date> {Overridepublic Date convert(String s) {try {SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-MM-dd");return simpleD…

产品排名提升秘籍:亚马逊鲲鹏系统的独特优势

在亚马逊竞争激烈的市场中&#xff0c;商家们一直在寻找新的方法来提升产品排名和吸引更多的顾客。近期&#xff0c;一款名为“亚马逊鲲鹏系统”的全自动化运行软件引起了广泛关注。该软件集成了一系列独特的功能和特点&#xff0c;旨在帮助商家更轻松地管理其亚马逊业务&#…

Gitea Webhook报错 webhook.ALLOWED_HOST_LIST setting

Gitea Webhook报错 webhook.ALLOWED_HOST_LIST setting 登录到Gitea中&#xff0c;编辑app.ini vi /data/gitea/conf/app.ini [webhook] ALLOWED_HOST_LIST 你的IP地址示例 [webhook] ALLOWED_HOST_LIST 192.168.3.98

企业微信无法正常启动 报错0xc0000142

报错内容如下&#xff0c;每次打开工作电脑时候企业微信一般会正常启动&#xff0c;但是有时候经常会出现下面这种错误&#xff0c;重启也解决不了&#xff0c;每次都得重装企业微信&#xff0c;今天整理了一下网上的方法&#xff0c;这个原因大概率是亿赛通。 解决办法&#x…

SofaMQ一些常用的API

SofaMQ的十五种常用的API 引言 SofaMQ作为阿里巴巴开源的消息中间件&#xff0c;提供了丰富的API以支持各种消息传递场景。在本文中&#xff0c;我们将介绍SofaMQ的十五种常用API&#xff0c;并通过实例演示其用法。 1. Producer相关API 1.1 SofaMQProducer SofaMQProduce…

2024年网络安全比赛--内存取证(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.从内存文件中找到异常程序的进程&#xff0c;将进程的名称作为Flag值提交&#xff1b; 2.从内存文件中找到黑客将异常程序迁移后的进程编号&#xff0c;将迁移后的进程编号作为Flag值…

Python学习之路——异常捕获

一、什么是异常 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”&#xff0c;也就是bug 二、异常的捕获方法 当我们的程序遇到bug&#xff0c;那么就下来有两种情况 ①整个程序因为一个…

Statistics with Python Specialisation: 数据库、可视化方法

目录 前言Numpy Arrays (the ndarray)1. 导入 NumPy&#xff1a;2. 创建 NumPy 数组&#xff1a;3. 数组的基本属性&#xff1a;4. 访问数组元素&#xff1a;5. 数组切片&#xff1a;6. 数学运算&#xff1a; pandas 示例&#xff1a;用平均值填充缺失值ScipyMatPlotLib&#x…

Elasticsearch:和 LIamaIndex 的集成

LlamaIndex 是一个数据框架&#xff0c;供 LLM 应用程序摄取、构建和访问私有或特定领域的数据。 LlamaIndex 是开源的&#xff0c;可用于构建各种应用程序。 在 GitHub 上查看该项目。 安装 在 Docker 上设置 Elasticsearch 使用以下 docker 命令启动单节点 Elasticsearch 实…

注解(Annotations)是什么?你用过哪些注解?解释依赖注入(DI)。

在编程语言中&#xff0c;注解&#xff08;Annotation&#xff09;是一种元数据机制&#xff0c;允许程序员向源代码中添加信息&#xff0c;这些信息可以被编译器、IDE或其他工具读取和处理&#xff0c;但不会影响程序的运行时行为。注解主要用于代码的自文档化、编译时检查、运…

chromedriver+Selenium+springboot+Java实现后端截图

chromedriver这种方法实现截图&#xff0c;依赖服务器端的谷歌浏览器软件&#xff0c;需要在服务器端下载谷歌浏览器。 Windows服务器说明 1.下载谷歌浏览器 2.根据第一步下载的谷歌浏览器版本&#xff0c;下载chromedriver&#xff0c;可以在这个页面找到和版本相近的版本去下…

docker部署Jira+配置MySQL8数据库

写在前面&#xff1a;如果你通过docker安装Jira且启动过&#xff0c;然后你现在又想使用mysql数据库&#xff0c;需要注意 你除了停掉原有容器&#xff0c;还需要删除&#xff1a;/var/lib/docker/volumes/jiraVolume/_data下的文件&#xff0c;否则启动后会无法正常使用。注意…

Redis 笔记一

概览 1.Redis核心数据存储结构 2.Redis底层String编码int&embstr&raw 3.Redis底层压缩列表&跳表&哈希表 4.Redis底层Zset实现压缩列表和跳表如何选择 5.基于Redis实现微博&抢红包&12306核心业务 辅助学习&#xff1a;Redis 教程 | 菜鸟教程 1.Redis为什…

ArcGIS初始化软件界面Normal.mxt

ArcGIS有时候永久了&#xff0c;或者呢突然不自觉软件界面乱了&#xff0c;或者一些窗口打开却找不到&#xff01; 这时候可以去删除arcgis的界面配置文件&#xff0c;Normal.mxt 删除后再打开软件&#xff0c;软件界面就会回到初始化设置了&#xff01; 文件所在的路径&…

从零开始学习Zeppelin:大数据可视化分析的交互式开发系统!

介绍&#xff1a;Apache Zeppelin是一个基于Web的交互式开发系统&#xff0c;主要用于进行大数据可视化分析。其核心概念是notebook&#xff0c;所有的操作都可以在notebook中完成。Zeppelin提供了一套非常全面的数据分析解决方案&#xff0c;支持数据采集、数据发现、数据分析…

网络安全应急响应灾备KB

目录 应急响应 定义 特点 国家相关标准和文件 事件分类与分级 应急响应组织 取证与保全 信息安全应急响应管理过程 灾备 关键词 灾备政策 灾备等级 灾备策略 受害恢复能力级别 灾难恢复管理过程 应急响应 定义&#xff1a; 指组织为了应对突发/重大信息安全管理…

canal server初始化源码分析

CanalLauncher类是canal server端启动的入口类&#xff0c;跟随代码进行深入。 在开始之前&#xff0c;我们可以先了解下&#xff0c; canal 配置方式 ManagerCanalInstanceGenerator&#xff1a; 基于manager管理的配置方式&#xff0c;实时感知配置并进行server重启Spring…

k8s---ingress对外服务(七层)

ingress 概念 k8s的对外服务&#xff0c;ingress service作用现在两个方面&#xff1a; 1、集群内部&#xff1a;不断跟踪的变化&#xff0c;更新endpoint中的pod对象&#xff0c;基于pod的ip地址不断变化的一种服务发现机制。 2、集群外部&#xff1a;类似于负载均衡器&a…