日新刷题 - 263. 丑数

99 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

一、题目描述:

263. 丑数 - 力扣(LeetCode)

给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false

丑数 就是只包含质因数 23/或 5 的正整数。

 

示例 1:

输入:n = 6
输出:true
解释:6 = 2 × 3

示例 2:

输入:n = 8
输出:true
解释:8 = 2 × 2 × 2

示例 3:

输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。

示例 4:

输入:n = 1
输出:true
解释:1 通常被视为丑数。

提示:

  • -2^31 <= n <= 2^31 - 1

二、思路分析:

首先对n取0(返回false)和1(返回true)首先进行判断,然后利用while循环(循环次数不确定)判断n是否能被2,3,5其中一个数整除,如果可以则先从5开始判断(其次再判断3、2,增加循环速度),再判断所得商是否为1,如果不为1,则使用continue关键字直接开始下次循环,如果得到的商不能被2、3、5中任意一个数整除,则表明它不是丑数,返回false。

三、AC 代码:

class Solution {
public:
    bool isUgly(int n) 
    {
       if(n==1)//n取0(返回false)
     {
        return true;
     }
     if(n==0)//n取1(返回true)
     {
         return false;
     } 
      while(n%2==0||n%3==0||n%5==0)//判断n是否能被2,3,5其中一个数整除
    {
      if(n%5==0)//先从能否被5整除开始判断,加快循环速度
    {
         n/=5;
         if(n==1)//如果所得商为1,则返回true
         {
             return true;
         }
         else//否则直接进行下一轮循环
         {
             continue;
         } 
     }
      if(n%3==0)//同上流程
    {
         n/=3;
         if(n==1)
         {
             return true;
         }
         else
         {
             continue;
         } 
     }
      if(n%2==0)//同上流程
    {
         n/=2;
         if(n==1)
         {
             return true;
         }
         else
         {
             continue;
         } 
     }
     }
     return false;//跳出循环表明该数不是丑数
    }
};

四、参考:

此题只能用自顶向下的DP函数解法,无法使用自底向上的DP表动态规划 - 丑数 - 力扣(LeetCode)

【注意n的范围-简简单单过周末】负数不是丑数,1是丑数 - 丑数 - 力扣(LeetCode)