LeetCode - 263 - 丑数(ugly-number)

Create by jsliang on 2019-07-18 17:15:35
Recently revised in 2019-07-18 17:43:26

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | |  3.1 解法 - 数学 | |  3.2 解法 - 递归 |

二 前言

  • 难度:简单

  • 涉及知识:数学

  • 题目地址:https://leetcode-cn.com/problems/ugly-number/

  • 题目内容

编写一个程序判断给定的数是否为丑数。	
丑数就是只包含质因数 2, 3, 5 的正整数。	
示例 1:	
输入: 6	
输出: true	
解释: 6 = 2 × 3	
示例 2:	
输入: 8	
输出: true	
解释: 8 = 2 × 2 × 2	
示例 3:	
输入: 14	
输出: false 	
解释: 14 不是丑数,因为它包含了另外一个质因数 7。	
说明:	
1 是丑数。	
输入不会超过 32 位有符号整数的范围: [−231,  231 − 1]。

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

3.1 解法 - 数学

  • 解题代码

var isUgly = function(num) {	
  if (!num) {	
    return false;	
  }	
  while (num % 2 === 0 || num % 3 === 0 || num % 5 === 0) {	
    if (num % 2 === 0) {	
      num = num / 2;	
    }	
    if (num % 3 === 0) {	
      num = num / 3;	
    }	
    if (num % 5 === 0) {	
      num = num / 5;	
    }	
  }	
  if (num === 1) {	
    return true;	
  }	
  if (num !== 2 || num !== 3 || num !== 5) {	
    return false;	
  }	
  return true;	
};
  • 执行测试

  1. num: 14

  2. return: false

  • LeetCode Submit

✔ Accepted	
  ✔ 1012/1012 cases passed (92 ms)	
  ✔ Your runtime beats 94.63 % of javascript submissions	
  ✔ Your memory usage beats 43.01 % of javascript submissions (35.4 MB)
  • 解题思路

最复杂的思路,有可能是你最原始的思路

首先,虽然我这个题解可能复杂,但是我觉得我开始的思维是极其简单的。

  1. 如果这个 num===0,那么它不是丑数。

  2. 如果这个数 %2===0 或者 %3===0 或者 %5===0,那么证明这个数是 2/3/5 的公倍数,那么我们就将它除于 2/3/5,同时这个数还可能是丑数。(例如 30 / 2 = 15,15 可能是丑数,所以可以继续循环)

  3. 循环这个数,直到它不能 %2、 %3 或者 %5 得出的结果为 0。

  4. while 后,这个数已经不能整除 2/3/5 了,所以我们最终判断它的值为多少。如果是 2/3/5,表明它是丑数;如果不是,则它不是丑数。

var isUgly = function(num) {	
  if (!num) {	
    return false;	
  }	
  while (num % 2 === 0 || num % 3 === 0 || num % 5 === 0) {	
    if (num % 2 === 0) {	
      num = num / 2;	
    }	
    if (num % 3 === 0) {	
      num = num / 3;	
    }	
    if (num % 5 === 0) {	
      num = num / 5;	
    }	
  }	
  if (num === 1) {	
    return true;	
  }	
  if (num !== 2 || num !== 3 || num !== 5) {	
    return false;	
  }	
  return true;	
};

最后,将结果值返回出去。

3.2 解法 - 递归

  • 解题代码

var isUgly = function (num) {	
  var list = [1, 2, 3, 5];	
  if (num <= 0) {	
    return false;	
  }	
  if (list.includes(num)) {	
    return true;	
  } else {	
    for (li in list) {	
      if (num % list[li] === 0 && list[li] !== 1) {	
        return isUgly(num / list[li]);	
      }	
    }	
  }	
  return false;	
};
  • 执行测试

  1. num: 14

  2. return: false

  • LeetCode Submit

✔ Accepted	
  ✔ 1012/1012 cases passed (104 ms)	
  ✔ Your runtime beats 76.45 % of javascript submissions	
  ✔ Your memory usage beats 7.53 % of javascript submissions (35.8 MB)
  • 知识点

  1. includes(): includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回 false。 reduce() 详细介绍

  • 解题思路

判断这个数,是否属于 1、2、3、5,如果不属于,则按照丑数规则进行递归,最后返回这个数的结果即可。


不折腾的前端,和咸鱼有什么区别!

640?wx_fmt=jpeg

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

640?wx_fmt=png

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值