剑指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 }

浙公网安备 33010602011771号