题目:我们把只包含因子2,3,5的数叫做丑数。寻找第1500个丑数。通常把1当成第一个丑数。

思路1:第一步判断是否为丑数:丑数是只包含2,3,5的数,因此一定可以被2,3,5整除。通过求余数是否为零做为判断条件,通过除以来减小整个数的值,知道整个数为1.返回true.

第二步找到第N个丑数的值,这一种做法的缺点是,不是丑数的数也要求余数除数的运算,因此耗时。因此我们提出一种以空间换时间的方法(谁让如今硬件更新的快呢)。如2思路。

思路2:我采用一个数组按照从小到大的顺序存放丑数。数组中最后一个放入的丑数即是最大的丑数M。然后,将M之前的数分别乘以,2,3,5来找到下一个大于M的丑数。改变M的值为最后找的的丑数。在2乘以M之前的丑数的时候一定存在某个丑数在它之前的数和2相乘都小于M,之后的数都大于M。我们可以记录下这个数。并且更新它。就可以很快的找到和2相乘大于M的那个丑数了。

Java代码思路1:

//思路:第一步:判断一个数是否为丑数。由于丑数是只包好2,3,5的因子的数,因此我们自然就想到了判断一个丑数先对2进行求余数如果为0再对它进行求除数减小数的大小,
//同样对3,和5也一样,最后如果结果为1就返回true。第二步,通过判断是否为丑数来数出第N个丑数对应的值。
public class FindUglyNumber {
//判断一个数是不是丑数
public 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 int uglyNumber(int uglyNumber){
if(uglyNumber<=0)
return 0;
int ugly=0;//记录丑数的个数
int number=0;//记录数字
while(ugly<uglyNumber){
number++;
if(isUgly(number))
ugly++;
}
return number;
}
public static void main(String[] args){
FindUglyNumber findUglyNumber=new FindUglyNumber();
int uglyNumber=findUglyNumber.uglyNumber(3);
System.out.println(uglyNumber);
} }

Java代码思路2:

//思路:将uglyNumber按照从小到大的顺序保存在数组中。因为uglyNumber是只包含2,3,5因子的数,
//因此可以用一个M表示数组中最大的数,也是数组中最后一个存入的数,而将之前的丑数分别乘2,3,5,然后保留大于M值的最小数。
//作为下一个M。我们前面说,M之前的每一个丑数都乘以2,3,5,其实这个可以确定在乘以2时在一定存在某个值,在它之前的数都小于M
//在它之后的数都大于M。
public class FindUglyNumber1 {
public int findUglyNumer(int index){
int[] uglyNumber=new int[index];
uglyNumber[0]=1;
int nextNumber=1;
int nextNumber2=0;
int nextNumber3=0;
int nextNumber5=0;
while(nextNumber<index){
int min=min(uglyNumber[nextNumber2]*2,uglyNumber[nextNumber3]*3,uglyNumber[nextNumber5]*5);
uglyNumber[nextNumber]=min;
while(uglyNumber[nextNumber2]*2<=uglyNumber[nextNumber])
nextNumber2++;
while(uglyNumber[nextNumber3]*3<=uglyNumber[nextNumber])
nextNumber3++;
while(uglyNumber[nextNumber5]*5<=uglyNumber[nextNumber])
nextNumber5++;
nextNumber++;
}
int ugly=uglyNumber[nextNumber-1];
return ugly;
} public int min(int i, int j, int k) {
int min=i<j?i:j;
return min<k?min:k;
}
public static void main(String[] args){
FindUglyNumber1 findUglyNumber=new FindUglyNumber1();
int uglyNumber=findUglyNumber.findUglyNumer(3);
System.out.println(uglyNumber);
} }

最新文章

  1. npm 发布到远程资源库
  2. UIAlertController
  3. Python Day7
  4. win8 vs2010 openni2 配置
  5. change,propertychange,input事件小议
  6. phpcms流程
  7. LeetCode:Permutations, Permutations II(求全排列)
  8. 11G RAC 简单命令
  9. linux和windows文件名称长度限制
  10. 案例:用JS实现放大镜特效
  11. shell之冒号的作用
  12. json数据的获取(网络摘抄)
  13. use ContourPlot-使用ContourPlot
  14. Sql Sever语句 (续2)
  15. mongodbVUE基本操作(转)
  16. [转]OpenLiveWriter 代码插件
  17. Spring-framework
  18. java第一章抽象和封装
  19. day9文件操作---从即日起时景丽阳老师给我们讲课
  20. java Concurrent包学习笔记(五):Semaphore

热门文章

  1. JavaScript的消息机制
  2. vue2.0过度动画
  3. ubuntu linux 1604 编译安装tesseract-ocr 4.0
  4. 《React-Native系列》3、RN与native交互之Callback、Promise
  5. [算法] 将单链表的每K个节点之间逆序
  6. grable编译spring源码并导入eclipse
  7. MSER(Maximally Stable Extremal Regions)算法总结
  8. spring通知的注解
  9. 前端人脸识别框架Tracking.js与JqueryFaceDetection
  10. maven项目Dao层优化