第三届蓝桥杯Java组 最大数
Description
[12,127,85,66,27,34,15,344,156,344,29,47,…]
这是某设备测量到的工程数据。
因工程要求,需要找出最大的5个值。
一般的想法是对它排序,输出前5个。但当数据较多时,这样做很浪费时间。因为对输出数据以外的数据进行排序并非工程要求,即便是要输出的5个数字,也并不要求按大小顺序,只要找到5个就可以。
以下的代码采用了另外的思路。考虑如果手里 已经 抓着5个最大数,再来一个数据怎么办呢?让它和手里的数据比,如果比哪个大,就抢占它的座位,让那个被挤出来的再自己找位子,…
请分析代码逻辑,并推测划线处的代码。
注意:只写划线处应该填的内容,划线前后的内容不要抄写。
Input
没有输入。
Output
填写适当代码替换横线,使得程序能输出序列中最大的5个值。
思路
开始看到这个题,脑子里最先闪过的就是递归函数,刚开始我没有
发现这个递归函数是怎么递归的。
但结合题目中所说,考虑如果手里 已经 抓着5个最大数 这里应该先取出五个数,然后将剩余7个数 与 已经取出的5个数依次进行对比。
让它和手里的数据比,如果比哪个大,就抢占它的座位,让那个被挤出来的再自己找位子,…
好了现在我们开始看代码
package Test;
import java.util.*;
public class Test_lanqiao
{
public static List<Integer> max5(List<Integer> lst)
{
if(lst.size()<=5) return lst;//返回到最近调用 lst 的地方 因此推出是第一个需要填空的地方
int a = lst.remove(0);
// 填空
List<Integer> b = max5(lst);// 递归函数
for(int i=0; i<b.size(); i++)
{
int t = b.get(i);
//下面的代码就是开始进行比较,
if(a>t)
{
//将大的值替换到小的值的位置
Collections.replaceAll(b, t, a);// 填空
a = t; //将小的值踢出,让他重新与别的值进行比较
}
}
return b; //返回到最近调用 b 的地方 即List<Integer> b = max5(lst);// 递归函数
处
}
public static void main(String[] args)
{
List<Integer> lst = new Vector<Integer>();
lst.addAll(Arrays.asList(12,127,85,66,27,34,15,344,156,344,29,47));
System.out.println(max5(lst));
}
具体的可以在代码中增加几个 System.out.prinln();
可以打印,这样可以更加直观的看代码具体的功能
Java list.remove( i )方法 删除具体位置的值
i 是移除 list 中具体位置下标
b.get(i);方法 查看具体位置的值
i 是查看 b 中具体位置下标
Collections.replaceAll() 的方法见下方link
Java集合-Collections的replaceAll()方法