题目:我们把只包含因子2,3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6,8都是丑数,但是14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。
方法一:
如果一个数能被2整除,把它连续除以2;如果能被3整除,就连续除以3;如果能被5整除,就连续除以5。如果最后得到的结果是1,那么这个数就是丑数。
public class Solution{ public static boolean isUgly(int number){ if(number<=0){ return false; } while(number%2==0){ number/=2; } while(number%3==0){ number/=3; } while(number%5==0){ number/=5; } return number==1?true:false; } public static int getUglyNumber(int index){ if(index<=0){ return 0; } int number=1; int times=1; while(times<index){ number++; if(isUgly(number)){ times++; } } return number; } public static void main(String[] args){ int number=getUglyNumber(10); System.out.println(number); } }
方法二(效率高):
创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2,3或者5得到的。如果上一丑数是M,那么把一个乘以2大于M的结果记为M2,同样把已有的每个丑数乘以3和5,能得到第一个大于M的结果M3和M5,那么下一个丑数应该是M2,M3和M5这3个数的最小者。
public class Solution{ public static int getUglyNumber(int index){ if(index<=0){ return 0; } int[] numbers=new int[index]; numbers[0]=1; int times=1; int n2=1; int n3=1; int n5=1; while(times<index){ int min=min(n2*2,n3*3,n5*5); numbers[times]=min; while(n2*2<=min){ n2++; } while(n3*3<=min){ n3++; } while(n5*5<=min){ n5++; } times++; } int uglyNumber=numbers[times-1]; return uglyNumber; } public static int min(int n1,int n2,int n3){ int min=n1>n2?n2:n1; min=min>n3?n3:min; return min; } public static void main(String[] args){ int uglyNumber=getUglyNumber(10); System.out.println(uglyNumber); } }
posted on
浙公网安备 33010602011771号