剑指Offer - 面试题49:丑数

2023-10-28

题目

我们把只包含因子2、3、5的数称为丑数(Ugly Number)。求按照从小到大的顺序的第1500个丑数。例如,6、8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当作第一个丑数。

分析

暴力法

从1开始每个数字都判断,若是丑数,计数器就+1。
前20个丑数为:1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36。
C++

#include <iostream>

using namespace std;

bool IsUglyNum(int n)//判断是否为丑数
{
    while (n % 2 == 0)
    {
        n /= 2;
    }
    while (n % 3 == 0)
    {
        n /= 3;
    }
    while (n % 5 == 0)
    {
        n /= 5;
    }
    
    if (n == 1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int GetUglyNumber(int n)//获取第n个丑数
{
    if (n <= 0)
    {
        return -1;
    }

    int count = 1;
    int number = 1;//第一个丑数

    for (int i = 2; count < n; i++)
    {
        
        if (IsUglyNum(i) == true)
        {
            count++;
            number = i;
            cout << i << endl;
        }
    }
    return number;
}

int main()
{
    int num = GetUglyNumber(10);
    cout << "第10个丑数是:" << num << endl;
    return 0;
}

测试结果
在这里插入图片描述
下图为n=155时的运行时间。36s
在这里插入图片描述

为了测试程序的正确性,我们将n=10再测试一遍
在这里插入图片描述

规律法

上面验证是否为丑数,是通过整除以2、3、5。那么我们能否通过乘以2、3、5来得出新的丑数呢。
我们创建一个数组ugly,将第一个丑数放进去,然后2用i来标记它自己的进度,同理3用j,5用k。每次取2*ugly[i]3*ugly[j]5*ugly[k]三者最小值,并将对应的下标+1,若最小值为多个,多个均+1。

我们举个例子:现在数组内只有{1,0…}。然后取2*ugly[i]3*ugly[j]5*ugly[k]小值为2*ugly[i],我们将值存入数组中。并将i++,数组就有{1,2}。以此类推

C++

#include <iostream>
#include <algorithm>
using namespace std;

int GetUglyNumber(int n)//获取第n个丑数
{
    if (n <= 0)
    {
        return -1;
    }
    int* ugly = new int[n];
    ugly[0] = 1;
    int i = 0;
    int j = 0;
    int k = 0;
    
    for (int index = 1; index < n; index++)
    {
        ugly[index] = min(ugly[i] * 2, min(ugly[j] * 3, ugly[k] * 5));

        if (ugly[index] == ugly[i] * 2)
        {
            i++;
        }
        if (ugly[index] == ugly[j] * 3)
        {
            j++;
        }
        if (ugly[index] == ugly[k] * 5)
        {
            k++;
        }
    }

    return ugly[n-1];
}

int main()
{
    int num = GetUglyNumber(1500);
    cout << "第1500个丑数是:" << num << endl;
    return 0;
}

测试结果与暴力法一样
在这里插入图片描述

本章完!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指Offer - 面试题49:丑数 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问

随机推荐

  • VMtools的安装

    基本概述 1 可以实现命令在Windows与centos上复制粘贴 2 可以实现Windows与centos上文件夹共享 VMtools的安装步骤 1 进入Centos系统 2 点击VM菜单的安装VMware Tools 因为我已经安装了
  • 一文彻底理解DMA

    DMA Direct Memory Acess 1 什么是DMA 有什么作用 2 DMA传输过程简述 2 1 DMA普通传输过程 2 2 DMA指针递增传输过程 2 3 DMA循环传输过程 2 4 DMA双缓冲区传输过程 3 STM32F4
  • 使用arraycopy方法复制数组

    6 使用arraycopy方法复制数组 package array public class array public static void main String args TODO Auto generated method stub
  • 目标检测中Anchor如何映射到原图

    利用深度学习进行目标检测一般需要经过较深的卷积神经网络 而卷积本身就有位置不变性 会将原图中的某块区域映射为特征图上的某个点 anchor和特征图的关系 既然anchor是特征图对应像素点在原图的某个区域 那么是怎样的对应关系呢 现在假设某
  • 下载R包遇到的问题用这个方法解决了!!!

    之前我一直以为一个镜像源能适用于下载所有的R包 然而最近两天在线下载R包没有一次成功的 也改了很多次镜像源 然而每次都报错 unable to access index for repository http streaming stat
  • GD32替代STM32使用Cube MX的HAL库开发

    目录 一 STM32F103与GD32F103 差别比较 二 GD32使用CubeMX配置 1 配置单片机型号 2 晶振配置 3 其它配置 三 GD32使用Keil配置 1 更改型号为GD32芯片 2 编译下载 四 例程下载链接 一 STM
  • C++之智能指针auto_ptr

    当你在读这篇文章的时候 应该都有这样一个疑问 那就是为什么要使用智能指针 我们先看这样一个示例 include
  • RC4(原理+代码+调用openssl库+报错分析)

    目录 一 原理 1 流密码的基本思想 2 RC4流密码算法的原理 1 初始化数据表S和T 2 初始置换数据表S 密钥调度算法 3 生成密钥流 伪随机数生成算法 二 代码实现 三 调用openssl库实现RC4 1 代码实现 2 调用open
  • 结合Wireshark捕获分组深入理解DNS协议

    一 概述 1 1 DNS 识别主机有两种方式 主机名 IP地址 前者便于记忆 如www yahoo com 但路由器很难处理 主机名长度不定 后者定长 有层次结构 便于路由器处理 但难以记忆 折中的办法就是建立IP地址与主机名间的映射 这就
  • vue3的文档

    四 Vue 3 1 TypeScript 1 动态类型的问题 前面我们讲过 js 属于动态类型语言 例如 function test obj obj 可能只是个字符串 test hello world obj 也有可能是个函数 test g
  • SLAM综述阅读笔记七:Visual and Visual-Inertial SLAM: State of the Art, Classification,and Experimental 2021

    Visual and Visual Inertial SLAM State of the Art Classification and Experimental Benchmarking 作者 Myriam Servi res Val ri
  • IP核的使用之ROM(Vivado)

    存储类IP核 ROM 文章目录 存储类IP核 ROM 一 引言 二 ROM IP核及相关内容扫盲 1 ROM简介 2 ROM的初始化文件介绍 3 分布式ROM和块ROM简介 4 单端口ROM和双端口ROM简介 三 分布式ROM IP核的创建
  • 高斯混合模型(GMM)先验的推断

    GMM先验的优化方程 假设图像降质模型为 Y A X N Y AX N Y AX N 我们希望恢复
  • 腾讯云SA3服务器AMD处理器CPU网络带宽性能详解

    腾讯云AMD服务器SA3实例CPU采用2 55GHz主频的AMD EPYCTM Milan处理器 睿频3 5GHz 搭载最新一代八通道DDR4 内存计算性能稳定 默认网络优化 最高内网收发能力达1900万pps 最高内网带宽可支持100Gb
  • 二极管常见分类及使用

    1 肖特基二极管 1 1概念 肖特基二极管 SBD 不是利用P型半导体与N型半导体接触形成PN结原理制作的 而是利用金属与半导体接触形成的金属 半导体结 肖特基势垒 原理制作的 因此 SBD也称为金属 半导体 接触 二极管或表面势垒二极管
  • 获取上个月的起止时间

    function 日期初始化 alert getStartDate alert getEndDate 获取开始时间 function getStartDate var date new Date var year date getFullY
  • Transform 基础知识

    Transform 变换 是场景中最常打交道的类 用于控制物体的位移 旋转 缩放等功能 Transform Class inherits from Component IEnumerable Position rotation and sc
  • HJ41 称砝码

    题目 HJ41 称砝码 题解 import java util 注意类名必须为 Main 不要有任何 package xxx 信息 public class Main public static void main String args
  • RBAC详解

    RBAC详解 1 RBAC模型的工作原理 2 RBAC模型的实现 3 总结 RBAC模型是一种基于角色的访问控制模型 它定义了一些规则和机制来控制用户对系统资源的访问 在本文中 我们将详细讨论RBAC模型的工作原理 并使用一个数据库示例来说
  • 剑指Offer - 面试题49:丑数

    题目 我们把只包含因子2 3 5的数称为丑数 Ugly Number 求按照从小到大的顺序的第1500个丑数 例如 6 8都是丑数 但14不是 因为它包含因子7 习惯上我们把1当作第一个丑数 分析 暴力法 从1开始每个数字都判断 若是丑数