• JS Leetcode 263. 丑数 题解分析,来认识有趣的丑数吧


    壹 ❀ 引

    本题来自LeetCode263. 丑数,难度简单,题目描述如下:

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

    丑数 就是只包含质因数 2、3 和/或 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 通常被视为丑数。
    

    提示:

    -231 <= n <= 231 - 1

    在简单分析题目后,你会发现这题确实挺简单,那么我们开始。

    贰 ❀ 简单的分析与实现

    根据题意,所谓丑数,是只包含质因数2,3,5的数字,说通俗点就是如果一个数能被这些数整除,那么这个数字就是一个丑数。我们来几个例子:

    let n = 8;
    8/2 = 4;
    4/2 = 2;
    2/2= 1;
    // 因此8是一个丑数
    
    let n = 15;
    15/5 = 3;
    3/3 = 1;
    // 15是一个丑数
    
    let n = 14;
    14/2 = 7;
    // 7再除以2,3,5都无法整除,因此不是一个丑数
    

    根据上面3个例子,我们会发现一个丑数可能被一个质因数直接整除完,它也可能需要依赖多个质因数才能整除完,那么有同学可能就要问了,那我拿到一个数字,我怎么知道它应该先除以几呢?其实跟先除以谁没关系,请再看15的例子:

    let n = 15;
    15/5 = 3;
    3/3 = 1;
    
    15/3 = 5;
    5/5 = 1;
    

    只要这个数字能被这几个质因数整除,那么它的顺序其实是无关,记住,前提是它能被整除。

    综合上面分析,我们总结下结论,一个数字可能被某个质因数直接整除完(比如8,9这种,最终等于1),一个数字可能需要依赖多个质因数才能整除完(比如15这种),那不就简单了,如果它能被一个质因数整除,那就循环让它一直除以这个质因数,如果不能整除了,我们就换下个质因数试试,如果三个质因数都无法整除了,我们看最终结果是否等于1,等于1自然是丑数,反之不是。

    那么怎么看一个数能否被一个质因数整除呢?当然是利用取余,比如:

    8%2//0
    9%3//0
    
    // 第一次能整除
    15%3//0
    // 我们就除以3,继续看5能不能被3整除
    15/3 = 5
    // 结果5不能被3整除了,那就试试其它质因数吧
    5%3 !== 0;
    // 哎,它可以被5整除,那就除以5
    5%5//0
    5/5 = 1
    //1不能被2 3 5整除了,都不满足条件了,最终结果等于1,所以是丑数
    

    上述就是程序的执行过程,让我们来实现它:

    /**
     * @param {number} n
     * @return {boolean}
     */
    var isUgly = function (n) {
      	// 注意,如果小于等于0肯定不是丑数
        if(n <= 0){
            return false;
        }
      	// 能不能被2一直整除下去?能就一直除
        while (n % 2 === 0) {
            n = n / 2;
        }
      	// 不能整除2了来试试3和5,前面解释了先除以谁先后顺序没关系
        while (n % 3 === 0) {
            n = n / 3;
        }
        while (n % 5 === 0) {
            n = n / 5;
        }
        return n === 1;
    };
    

    OK,一道简单的丑数题就写到这里了。

  • 相关阅读:
    CSS基础
    bootbox api
    实现浏览器遗漏的原件 jQuery.selectCheckbox
    获取图片宽高方法
    javascript基础知识
    找工作总结
    cms配置使用
    页面被运营商加载广告
    iOS7 隐藏状态栏 hide statusBar
    Status Bar in iOS7
  • 原文地址:https://www.cnblogs.com/echolun/p/14647570.html
Copyright © 2020-2023  润新知