题目描述:
编写一个程序判断给定的数是否为丑数。
丑数就是只包含质因数 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]。
解题思路1:首先看到这道题,我们可以将它理解为一类体型来处理,即筛选出能除以某些特定质数的数,然后本题给出的是能除以2,3,5的数,那就很好理解了嘛,我就先对这个数疯狂除以2,当所有为2的质数除完之后我再去除3,以此类推我再去除以5,经过三个操作后得到的必定是一个既不能再被2,3,5相除的数,这个时候只需判断是否为1,就可知道原来这个数是不是丑数。
所遇问题1:想法很美好,但是显然这个题解的效率是相当相当低的,以至于不能通过检测,直接报出来运行超时的错误。
public boolean isUgly(int num) {
while (true){
if(num % 2 != 0)
break;
else
num = num / 2;
}
while (true){
if(num % 3 != 0)
break;
else
num = num / 3;
}
while (true){
if(num % 5 != 0)
break;
else
num = num / 5;
}
if (num == 1)
return true;
else
return false;
}
解题思路2:时间效率是好的题解的第一思考要素,所以我就想到使用空间获取时间,这样的最好解决方法必然是通过递归来解决问题,首先对于负数先进行一层筛选过滤,其次进行2,3,5质数筛选过滤,当数字除到最后再判断便可获得题解答案,所以我尝试来这种方法,然后
果然达到了我的预期,在空间占用率超级超级高的情况下,时间占用率超过了百分之百的提交用户。
public boolean isUgly(int num) {
if (num <= 0){
return false;
}
if (num == 1)
return true;
if (num % 5 == 0)
num = num / 5;
else if (num % 3 == 0)
num = num / 3;
else if (num % 2 == 0)
num = num / 2;
else {
return false;
}
return isUgly(num);
}