zoukankan      html  css  js  c++  java
  • [剑指Offer]49-丑数

    题目

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

    题解

    • 把丑数按顺序依次算好放在数组中,uglyNum[nextUglyIdx]=Min(uglyNum[multi2Idx]*2,uglyNum[multi3Idx]*3,uglyNum[multi5Idx]*5);;
    • 此外更新当前的三个指针multi2Idx、multi3Idx、multi5Idx,其中,例如multi2Idx对应得丑数*2将得到第一个大于当前丑数数组最大值的数。

    代码

    import java.util.Scanner;
    
    public class Main {
    	public static void main(String[] args) {
    		Scanner s=new Scanner(System.in);
    		int index=s.nextInt();
    		System.out.println(GetUglyNumber_Solution(index));
    	}
    	
        public static int GetUglyNumber_Solution(int index) {
        	if(index<=0) {
        		return 0;
        	}
        	
        	int[] uglyNum=new int[index];
        	uglyNum[0]=1;
        	int nextUglyIdx=1;
        	int multi2Idx=0;
        	int multi3Idx=0;
        	int multi5Idx=0;
        	
        	while(nextUglyIdx<index) {
        		uglyNum[nextUglyIdx]=Min(uglyNum[multi2Idx]*2,uglyNum[multi3Idx]*3,uglyNum[multi5Idx]*5);
        		
        		while(uglyNum[multi2Idx]*2<=uglyNum[nextUglyIdx]) {
        			++multi2Idx;
        		}
        		while(uglyNum[multi3Idx]*3<=uglyNum[nextUglyIdx]) {
        			++multi3Idx;
        		}
        		while(uglyNum[multi5Idx]*5<=uglyNum[nextUglyIdx]) {
        			++multi5Idx;
        		}
        		
        		++nextUglyIdx;
        	}
        	
            return uglyNum[index-1];
        }
        
        public static int Min(int... nums) {
        	int min=Integer.MAX_VALUE;
        	for(int num:nums) {
        		min=min<num?min:num;
        	}
        	return min;
        }
    }
    
  • 相关阅读:
    MVC三层架构
    JavaScript,你好!(二)
    HTML你好!
    Typora,你好!
    安装mysqlmysql-5.7.24-linux-glibc2.12-x86_64
    sizeof与strlen的区别
    printf格式化输出
    java泛型讲解
    双系统删除Linux系统
    kali破解wifi密码
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11148194.html
Copyright © 2011-2022 走看看