只包含因子2,3,5,的数称为丑数;求小到大的顺序的第1500个丑数,1是第一个丑数 方法一:不牺牲空间进行,遍历增加
bool isUgly(int number){ while(number%2==0) number/=2; while(number%3==0) number/=3; while(number%5==0) number/=5; return (number==1)? true:false; } int GetUglyNumber(int index){ if(index<=0) return 0; int number=0; while(index>0){ ++number; if(isUgly(number)) index--; } }
方法二:牺牲空间换时间,利用第一个丑数1得到其他丑数,根据丑数大小排序
private static int getUglyNumberAt(int index) { if (index < 1) return 0; if (index < 7) return index; //前6个数都是 int[] records = new int[index]; //从小到大记录丑数 records[0] = 1; //2, 3, 5对应的丑数位置,初始化为第一个位置,准备 int indexFor2 = 0; int indexFor3 = 0; int indexFor5 = 0; for (int i = 1; i < index; i++) { //已知的丑数乘以因子2, 3, 5, //使得这三个新丑数刚刚大于已在数组中的所有丑数 int product2 = records[indexFor2] * 2; int product3 = records[indexFor3] * 3; int product5 = records[indexFor5] * 5; //找出三个新丑数中最小的 int min = getMin(product2, product3, product5); records[i] = min; //更新2, 3, 5相应的丑数位置,min可能等于多个新丑数,所以不能用else if (product2 == min) indexFor2++; if (product3 == min) indexFor3++; if (product5 == min) indexFor5++; } return records[index - 1]; } private static int getMin(int a, int b, int c) { int result = a; if (b < result) result = b; if (c < result) result = c; return result; }