Python算法例36 丑数Ⅱ

news2025/1/8 5:38:20

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 None

    numbers = [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 += 1
        if next_num == numbers[idx3] * 3:
            idx3 += 1
        if next_num == numbers[idx5] * 5:
            idx5 += 1

    return 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.coloradmin.cn/o/1394621.html

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

相关文章

Python-基础篇-类与对象/面向对象程序设计

文章目录 思维导图是何物类定义类&#x1f4da; class类的成员&#x1f4da;类的继承性&#x1f4da;封装性&#x1f4da;多态性 对象面向对象&#x1f4da;创建对象&#x1f4da;销毁对象&#x1f4da; 类和对象关系必背必记专业英语学习角 思维导图 是何物 类 “类”是物以…

DotNET 8 新特性 - AoT 编译、 MinimalAPI、Json源生成器

AoT编译方式特性 裁剪减小体积&#xff0c;取消JIT编译&#xff0c;不使用反射技术。直接产生目标机器二进制代码&#xff0c;目前支持x86&#xff0c;解决被反编译问题。 使用本机 AOT 发布的应用&#xff1a;最大程度减少了磁盘占用空间缩短了启动时间减少了内存需求 | 功能…

springcloud +Vue 前后端分离的onlinejudge在线评测系统

功能描述&#xff1a; 本系统的研究内容主要是设计并实现一个一个在线测评系统&#xff08;OJ&#xff09;&#xff0c;该系统集成了博客、竞赛、刷题、教学&#xff0c;公告&#xff0c;个人管理六大功能&#xff0c;用户注册后登录系统&#xff0c;可以浏览本站的全部文章、发…

Nginx 简介

1、概念介绍 Nginx ("engine x") 是一个轻量级、高性能的 WEB 服务器软件和反向代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发…

67.基于控制流编程,优化Go代码可读性

文章目录 一&#xff1a;简介二、代码整洁小技巧&#xff1a;基于控制流编程三、总结 代码地址&#xff1a;https://gitee.com/lymgoforIT/golang-trick/tree/master/40-clean-code-controll-flow 一&#xff1a;简介 如何写好代码&#xff0c;一千个人眼中有一千个哈姆雷特&…

Docker之nacos集群部署

前言 Nacos 是一个开源的注册中心和配置中心&#xff0c;用于实现微服务架构中的服务发现、服务治理和动态配置管理。在 Docker 中使用 Nacos&#xff0c;你可以通过拉取官方提供的 Docker 镜像并运行容器的方式来快速部署 一.Nacos镜像拉取及独立模式 镜像拉取命令详解&…

用3D渲染效果图时,需要注意什么?

要用3D渲染效果图&#xff0c;您需要使用3D建模软件来创建三维模型、材质、灯光和相机等元素&#xff0c;并使用渲染引擎将它们渲染成逼真的图像。那么用3D渲染效果图需要注意什么? 在用3D渲染效果图时&#xff0c;您需要注意以下几点&#xff1a; 1、模型精度&#xff1a;模型…

qnx 上screen + egl + opengles 最简实例

文章目录 前言一、qnx 上的窗口系统——screen二、screen + egl + opengles 最简实例1.使用 addvariant 命令创建工程目录2. 添加源码文件3. common.mk 文件4. 编译与执行总结参考资料前言 本文主要介绍如何在QNX 系统上使用egl和opengles 控制GPU渲染一个三角形并显示到屏幕上…

在自定义数据集上训练 YOLOv8 进行目标检测

这是目标检测中令人惊叹的 AI 模型之一。在这种情况下&#xff0c;您无需克隆存储库、设置要求并配置模型&#xff0c;就像在 YOLOv5 及其之前的版本中所做的那样。 在 YOLOv8 中&#xff0c;不需要执行这些手动任务。您只需安装 Ultralytics 即可&#xff0c;我将向您展示如何…

C++:类(Class)

内容整理自&#xff1a;The Cherno:C系列&#xff0c;2024年1月18日 --------------------------------------------------------------------------------------------------------------------------------- 简单地说&#xff0c; 类&#xff0c;只是 数据功能 的整合体。…

SPI传感器接口设计与优化:基于STM32的实践

SPI&#xff08;串行外设接口&#xff09;是一种常用的串行通信协议&#xff0c;用于在微控制器和外部设备之间进行全双工的高速数据传输。在本文中&#xff0c;我们将探讨如何基于STM32微控制器设计和优化SPI传感器接口&#xff0c;并提供相应的代码示例。 1. SPI传感器接口设…

RXJS中Subject, BehaviorSubject, ReplaySubject, AsyncSubject的区别?

在RxJS&#xff08;Reactive Extensions for JavaScript&#xff09;中&#xff0c;Subject、BehaviorSubject、ReplaySubject和AsyncSubject都是Observable的变体&#xff0c;它们用于处理观察者模式中的不同场景。以下是它们之间的主要区别&#xff1a; 1、Subject: 是一种特…

【VMware】安装和卸载VMware的Ubuntu

安装视频&#xff1a;&#xff08;全程无废话&#xff09; https://www.bilibili.com/video/BV1W34y1k7ge/?spm_id_from333.337.search-card.all.click&vd_sourcefb8dcae0aee3f1aab700c21099045395

SegVol: Universal and Interactive Volumetric Medical Image Segmentation

Abstract 精确的图像分割为临床研究提供了有意义且结构良好的信息。尽管在医学图像分割方面取得了显著的进展&#xff0c;但仍然缺乏一种能够分割广泛解剖类别且易于用户交互的基础分割模型。 本文提出了一种通用的交互式体医学图像分割模型——SegVol。通过对90k个未标记的C…

Midjourney 1 月 17 日官方版本补丁更新公告,可能于二月底或三月向公众开放

Midjourney专区&#xff1a;Midjourney-喜好儿aigc 更多消息&#xff1a;AI人工智能行业动态&#xff0c;aigc应用领域资讯 功能更新和开发 修复/改变区域和缩小功能预计在本周或下周推出 测试一致的样式&#xff0c;强调样式而不是内容 常量字符功能正在开发中&#xff0c;但…

如何使用批量图片转换工具快速转换图片格式

你好!在我们的日常生活中&#xff0c;我们常常需要处理大量的图片。而有时候&#xff0c;我们可能会遇到一种情况&#xff0c;就是需要将多张图片批量转换为特定的格式&#xff0c;比如将图片批量转换为PNG格式。那么&#xff0c;如何实现这一操作呢?在本文中&#xff0c;我将…

详解IP安全:IPSec协议簇 | AH协议 | ESP协议 | IKE协议_ipsec esp

目录 IP安全概述 IPSec协议簇 IPSec的实现方式 AH&#xff08;Authentication Header&#xff0c;认证头&#xff09; ESP&#xff08;Encapsulating Security Payload&#xff0c;封装安全载荷&#xff09; IKE&#xff08;Internet Key Exchange&#xff0c;因特网密钥…

漏洞检测和评估【网站子域扫描工具02】

上一篇&#xff1a;爬取目标网站的域名和子域名【网站子域扫描工具01】 在Python中&#xff0c;有一些流行的漏洞扫描库可以对子域进行漏洞扫描和评估&#xff0c;比如Nmap、Sublist3r等。 1.端口扫描 以下是一个简单的示例代码&#xff0c;展示了如何使用Nmap进行基本的端口扫…

基于springboot+vue的高校心理教育辅导系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

查看pip及Python版本

Python环境正确安装之后&#xff0c;按“WinR”组合键打开“运行”对话框&#xff0c;输入“cmd”&#xff0c;如下图 打开命令提示符窗口后&#xff0c;输入以下命令查看Python及pip的版本。 pip -V 如果命令提示符窗口能够正确显示pip及Python版本&#xff0c;则说明Python…