剑指offer 丑数

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


丑数应该指的是 先不断除以2,再不断除以3,再不断除以5,最后结果为1

package t33;

/**
 * @author Calvin 2018年5月15日上午10:01:07
 * 把只包含因子2、3和5的数称作丑数(Ugly Number)。
 * 例如6、8都是丑数,但14不是,因为它包含因子7。
 *  习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
 *  首先除2,直到不能整除为止,然后除5到不能整除为止,然后除3直到不能整除为止。
 *  最终判断剩余的数字是否为1,如果是1则为丑数,否则不是丑数。
 */
public class Solution {

    public static void main(String[] args) {
        System.out.println(GetUglyNumber_Solution(7));
    }

    public static int GetUglyNumber_Solution(int index) {

        /**
         * 如果p是丑数,那么2p,3p,5p都是丑数
         * 每次取得当前生成的最小的丑数即可
         * 1 生成 2 3 5 ,其中2最小 因此 res[i] = 2
         * 更新f1
         * 然后下一轮 就是比较  4,3,5
         * 新生成的丑数2乘以3和乘以5的结果肯定比丑数1的结果小,
         * 所以不用放进来比较
         * 此时 3最小,因此res[i]=3
         * 这样下去,每次取到的都是最小的丑数
         * 并且用来乘2,乘3,乘5的也是没用过的最小丑数
         * 也就是没有用来乘2,乘3,乘5的数
         * 
         * f1,f3,f5保存用来乘2的最小数,乘3,乘5
         * ++是因为相等的时候,这个最小丑数已经记录了,要变成下一个最小数
         * 
         * 直接用3个if,不用else因为可能存在同时更新的情况,
         * 在之前的基础上推下去,会出现2个6的情况,这时候要同时更新f1和f2
         * 要不然就会重复了
         * 
         * */

        if(index <= 0){
            return 0;
        }
        int[] arr = new int[index];
        arr[0] = 1;
        //f1,f3,f5用来保存当前用来乘2,乘3,乘5的最小数
        int f1 = 0, f3 = 0, f5 = 0;
        for(int i = 1; i < index; ++i){
            //计算取得的值
            int r1 = arr[f1] * 2;
            int r3 = arr[f3] * 3;
            int r5 = arr[f5] * 5;
            //获取值中的最小数,也就是当前最小丑数
            arr[i] = Math.min(r1, Math.min(r3, r5));
            //更新
            if(arr[i] == r1){
                f1++;
            }
            if(arr[i] == r3){
                f3++;
            }
            if(arr[i] == r5){
                f5++;
            }
        }
        return arr[index - 1];
    }
}
阅读更多

扫码向博主提问

Calvin-Db

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • java
  • c
  • spring
  • mysql
  • js
去开通我的Chat快问
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a1065712890/article/details/80320311
上一篇Java 四种内部类
下一篇剑指offer 数组中只出现一次的数字
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭