发布时间:2022-12-21 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印

JZ49 丑数

题目

我们先看到题目,把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。

方法1:质因数分解(暴力)

思路

算法实现

问题
当输入数过大时,需要的时间会很长,所以此方法不行

代码

package mid.JZ49丑数;
import java.util.ArrayList;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        int current = 1;
        ArrayList<Integer> res = new ArrayList<>();
        res.add(1);
        while(true) {
            if (res.size() == index) {
                return res.get(res.size() - 1);
            }
            current++;
            if (check(current)) {
                res.add(current);
            }
        }
    }
    public boolean check(int num) {
        while(num % 2 == 0) num /= 2;
        while(num % 3 == 0) num /= 3;
        while(num % 5 == 0) num /= 5;
        return num == 1;
    }
    public static void main(String[] args) {
        System.out.println(new Solution().GetUglyNumber_Solution(1500));
    }
}

方法2

思路

代码

package mid.JZ49丑数;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if (index <= 6) return index;
        int x = 0, y = 0, z = 0;
        int[] res = new int[index];
        res[0] = 1;
        for (int i = 1; i < index; i++) {
            res[i] = Math.min(res[x]*2, Math.min(res[y]*3, res[z]*5));
            if (res[i] == res[x]*2) x++;
            if (res[i] == res[y]*3) y++;
            if (res[i] == res[z]*5) z++;
        }
        return res[index - 1];
    }
}