题目描述
有一队数列有2000个数字,其中的数字只含有因子:3,5,7。
第1个数字是:3
第2个数字是:5
第3个数字是:7
第4个数字是:9
第5个数字是:15
第10个数字是:45
请你设计程序查找这个数列中的第几个数字是多少。
思路解析
本体用枚举法数据规模比较大,所以换一种思路
第一个数字是3
第二个数字是5
第三个数字是7
3x3=9
3x5
3x7
5x5
5x7
7x7
9x3
9x5
…
可以看出用队列的每个元素乘3,5,7获得队列的下一个值
将这个队列加入数组,需要两个操作,去重和排序
这时我们用treeset存放元素即可完成去重和排序
上代码
public class test16 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n = sc.nextInt();
int arr[] = {3,5,7};
long first=1;
TreeSet<Long> tree=new TreeSet<Long>();
while(tree.size()<n+1000) {
for (int i = 0; i < arr.length; i++) {
long x=arr[i]*first;
tree.add(x);
}
first=tree.higher(first);//highter方法取得集合中略大于first的元素
}
for (int i = 0; i < n-1; i++) {
tree.pollFirst();//去除前n-1个元素,输出第n个元素
}
System.out.println(tree.first());
}
}
但本程序任然存在一些问题:在存放完第n个元素之后我们并不能确定这是第n个元素
例如:存放完7x7之后,存放3x9,而3x9是需要存放在7x7之前的,也就是说,后存放的元素可能是排在较前的元素
所以我在while循环中写的是,<n+1000,这个循环量已经能满足第2000个数的不漏排序.
如何完成指定n个数不漏排序欢迎在评论区探讨!