剑指Offer第二十二题:丑数

题目描述:

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

题目分析

1为丑数,后面的丑数是在1的基础上*2、*3、*5,所得的数,丑数=丑数*2或者*3或者*4。题目是按升序输入第N个丑数;思路也比较的简单,将算出的丑数存起来,然后再返回N-1的个值。

 

源代码

 1 public static int GetUglyNumber_Solution(int index) {
 2         ArrayList<Long> arrayList=new ArrayList<>();
 3         arrayList.add((long) 1);
 4         for(int i=0;arrayList.size()<=index+3;i++) {
 5             Long first=arrayList.get(i)*2;
 6             Long sec=arrayList.get(i)*3;
 7             Long tr=arrayList.get(i)*5;
 8             if(!arrayList.contains(first))
 9                 arrayList.add(first);
10             if(!arrayList.contains(sec))
11                 arrayList.add(sec);
12             if(!arrayList.contains(tr))
13                 arrayList.add(tr);
14         }
15         Collections.sort(arrayList);
16         
17         for(int i=0;i<arrayList.size();i++) {
18             System.out.println(arrayList.get(i)+",");
19         }
20         String reString=""+arrayList.get(index-1);
21         return Integer.parseInt(reString);
22     }

 

 

这个是我第一版的代码,思路很简单:就是把每一个的数字都乘出来再存入,但是呢,当控制条件arrayList.size()<=index有些时候会丢失数据,因为当数据大小达到N时,但是那个数还没有被乘出来,后来我又将改成arrayList.size()<=index*3,然后输出如下。

 

 

..............................................
-1280606378397051616,
-1130701282184728232,
-1066029657205645366,
-565350641092364116,
-476002213707681966,
1,
2,
3,
4,
5,
6,
8,
9,
10,
12,
.....................................
....................................
.......................................
8528825108523940304,
8583068847656250000,
8690357208251953125,
8940696716308593750,
8985370930000934825,
9032784136293220152,

很明显的看出来数据已经大到Int的范围了。显然不能先扔进数组再排序了,我们必须保证在扔进去就是有序的。

 

改进后的代码

 1  public static int GetUglyNumber_Solution(int index) {
 2         if(index<=0) return 0;
 3         ArrayList<Integer> arrayList=new ArrayList<>();
 4         arrayList.add(1);
 5         int first=0,sec=0,tr=0;
 6         for(int i=1;arrayList.size()<=index;i++) {
 7             arrayList.add(Math.min(arrayList.get(first)*2,Math.min(arrayList.get(sec)*3, arrayList.get(tr)*5)));//直接控制存入的就是最小值。
 8             if(arrayList.get(i)==arrayList.get(first)*2)
 9                 first++;
10             if(arrayList.get(i)==arrayList.get(sec)*3)
11                 sec++;
12             if(arrayList.get(i)==arrayList.get(tr)*5)
13                 tr++;
14         }
15         return arrayList.get(index-1);
16     }

 

posted @ 2018-09-09 17:34  轻抚丶两袖风尘  阅读(131)  评论(0)    收藏  举报