标签:丑数 面试题 index int number 四十九 records result
只包含因子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; }
标签:丑数,面试题,index,int,number,四十九,records,result 来源: https://www.cnblogs.com/niliuxiaocheng/p/12593281.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。