剑指offer 面试题34 丑数

剑指offer 面试题34 丑数

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

package algorithm.foroffer.top40;

/**
 * Created by liyazhou on 2017/5/30.
 * 面试题34:丑数
 *
 * 题目:
 *      我们把只包含因子 2、3 和 5 的数称作为丑数(Ugly number)。求从小到大的顺序的第 1500 个丑数。
 *      例如 6、8 都是丑数,但 14 不是,因为它包含了因子 7。习惯上,我们把 1 当做第一个丑数。
 *
 * 考查点:
 *      1. 根据定义找规律(没找到 =_=)
 *
 * 思路:
 *      1. 本办法,依次判断每一个自然数是否是丑数,当 k =1500 时明显感觉算时间较长
 *
 */
public class Test34 {

    public static int getKthUglyNumber(int k){
        if (k < 1) return -1;
         for (int number = 1; ; number++){
             if (isUgly(number)) k--;
             if (k == 0) return number;
        }
    }

    private static boolean isUgly(int number){
        while (number % 2 == 0) number /= 2;
        while (number % 3 == 0) number /= 3;
        while (number % 5 == 0) number /= 5;
        return number == 1;
    }

    public static void main(String[] args){
        System.out.println(getKthUglyNumber(8));  // 9
        System.out.println(getKthUglyNumber(1500));  // 859963392
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值