您的位置:首页 > 其它

丑数

2016-05-14 13:38 190 查看
题目描述:

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

思路:

1)初始化三个队列,和存放结果的min变量

2)将1先插入队列1中

3 ) 令x为三个队列中的最小值

4)若x存在于:

队列1:将 x * 2、x * 3、x*5 分别放入三个队列,从 队列1中移除x

队列2:将 x * 3、x*5 分别放入 队列2,3中,从 队列2中移除x

队列3:将 x * 5放入 队列3,从队列3中移除x

5)重复步骤3~5,知道找到第index个元素

import java.util.ArrayDeque;
import java.util.Scanner;

public class GetUglyNumber {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("input index:");
int index = scanner.nextInt();
System.out.println("The " + index + "th UglyNumber is:" + GetUglyNumber_Solution(index));
}
public static int GetUglyNumber_Solution(int index){
if(index < 1){
return 0;
}
ArrayDeque<Integer> deque1 = new ArrayDeque<Integer>();
ArrayDeque<Integer> deque2 = new ArrayDeque<Integer>();
ArrayDeque<Integer> deque3 = new ArrayDeque<Integer>();
int min = 0;
deque1.add(1);
for(int i=0;i<index;i++){
int minDeque1 = deque1.isEmpty() ? Integer.MAX_VALUE : deque1.peek();
int minDeque2 = deque2.isEmpty() ? Integer.MAX_VALUE : deque2.peek();
int minDeque3 = deque3.isEmpty() ? Integer.MAX_VALUE : deque3.peek();
min = Math.min(minDeque3, Math.min(minDeque1, minDeque2));
if(min == minDeque1){
deque1.add(2*min);
deque2.add(3*min);
deque3.add(5*min);
deque1.poll();
}
else if(min == minDeque2){
deque2.add(3*min);
deque3.add(5*min);
deque2.poll();
}
else{
deque3.add(5*min);
deque3.poll();
}
}
return min;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  丑数