Java源码-N个数字中第k个最大值的求解方法
来源:互联网 发布:https默认端口是多少 编辑:程序博客网 时间:2024/06/06 23:57
翻开《数据结构》正文第一页,作者问了个问题:N个数字中的第k个最大值怎么计算?
作者认为,对于学编程两年的人而言,这个问题应该可以拿下。
事实上,这是我刚学习编程,考计算机等级考试3、4级时的基本问题,当时是在别人写好的C语言代码段里,加上一个嵌套的for循环,就轻松搞定。
然而,10多年后,我决定用已经学了这么久的Java来“徒手”写个小程序,解决这个问题。
经验:
1. 用户输入数字的个数不确定,不能用数组来存储用户输入的值,而采用ArrayList来存储。
2. 最好先用纸笔预演一下,获得一个大概的算法,然后再写代码、调试。算法没搞清,直接写代码,有点本末倒置之嫌。
3. 常用算法,最好熟记,如果自己从零开始去琢磨,呵呵,你得感谢你老板给你那么多空闲时间。
代码如下:
<pre class="java" name="code">import java.util.Scanner;import java.util.ArrayList;//n个数,求最大的数字中的第k个public class HelloSort {public static void main(String[] args){Scanner input=new Scanner(System.in);int count=0;ArrayList<Double> numbers=new ArrayList<Double> ();double entry=0;do {System.out.print("请输入数字(输入-1结束输入):");entry=input.nextDouble();if(entry==-1)System.out.printf("已完成输入%n");else{numbers.add((Double)entry);count++;}}while(entry!=-1);double[] sortedNumbers=new double[count];for (int i=0;i<count;i++)sortedNumbers[i]=numbers.get(i);/*核心算法:用数组中未排序部分的第一个数和其后面所有数字比较,如果后面数字大,则互换位置这样可保证排在前面的数字是最大的,n个数需要循环n-1次*/double temp=0;for (int i=0;i<count-1;i++){for (int j=i+1;j<count;j++){if (sortedNumbers[j]>sortedNumbers[i]){temp=sortedNumbers[j];sortedNumbers[j]=sortedNumbers[i];sortedNumbers[i]=temp;}}}System.out.print("请输入k值:");int k=input.nextInt();System.out.printf("共输入了%d个数,分别为:",count);for (int i=0;i<count;i++){System.out.printf(numbers.get(i)+"\t");}System.out.printf("%n从大到小的排序为:");for (int i=0;i<count;i++){System.out.print(sortedNumbers[i]+"\t");}System.out.printf("%n最大的数字中的第"+k+"个为:"+sortedNumbers[k-1]+"%n%n");}}
运行结果:
请输入数字(输入-1结束输入):1.11
请输入数字(输入-1结束输入):2.12
请输入数字(输入-1结束输入):3.14159
请输入数字(输入-1结束输入):1.414
请输入数字(输入-1结束输入):-0.707
请输入数字(输入-1结束输入):-2.235
请输入数字(输入-1结束输入):5.325
请输入数字(输入-1结束输入):6.876
请输入数字(输入-1结束输入):16.50
请输入数字(输入-1结束输入):205.0698
请输入数字(输入-1结束输入):-1
已完成输入
请输入k值:6
共输入了10个数,分别为:1.11 2.12 3.14159 1.414 -0.707 -2.235 5.325 6.876 16.5 205.0698
从大到小的排序为:205.0698 16.5 6.876 5.325 3.14159 2.12 1.414 1.11 -0.707 -2.235
最大的数字中的第6个为:2.12
请输入数字(输入-1结束输入):2.12
请输入数字(输入-1结束输入):3.14159
请输入数字(输入-1结束输入):1.414
请输入数字(输入-1结束输入):-0.707
请输入数字(输入-1结束输入):-2.235
请输入数字(输入-1结束输入):5.325
请输入数字(输入-1结束输入):6.876
请输入数字(输入-1结束输入):16.50
请输入数字(输入-1结束输入):205.0698
请输入数字(输入-1结束输入):-1
已完成输入
请输入k值:6
共输入了10个数,分别为:1.11 2.12 3.14159 1.414 -0.707 -2.235 5.325 6.876 16.5 205.0698
从大到小的排序为:205.0698 16.5 6.876 5.325 3.14159 2.12 1.414 1.11 -0.707 -2.235
最大的数字中的第6个为:2.12
0 0
- Java源码-N个数字中第k个最大值的求解方法
- 找n个数字中第k小的元素
- N个数中的第k个最大值
- java获取数据中N个最大值的方法
- 在N个乱序数字中查找第k大的数字
- 【数据结构与算法分析】1.1 找出N个数字中第K大的数
- 在N个乱序数字中查找第k大的数字
- poj 1019 求一个1到n的序列中,第k个数字是多少
- 设计一组N个数,确定其中第k个最大值
- 1、一组N个数,确定其中第k个最大值
- java求解第N个素数(质数)
- 计算从N个数字中取K个数字的结果集
- 存储过程获取第N个最大值方法
- 算法 - n个数字形成的圆圈中循环删除第m个数字(C++)
- 求在一组N个的数中找出第K个最大数
- 第k个幸运数字
- 【数据结构】中对n个数字右移k位
- vector中删除第k个元素的巧妙方法
- PopupWindows 在指定控件上下左右显示
- HDU Problem 1896
- hdu 3989 HP and Polyjuice Potion & hdu 4626 Jinkeloid
- 7/26android培训第16天
- <data> 數據模型範例
- Java源码-N个数字中第k个最大值的求解方法
- HTML基础
- MJExtension 之模型建立后没有效果
- (16)HTML标签详解之<br /><hr /><!-- -->
- SQLserver总结(1)
- java 获得项目绝对路径
- Javascript事件委托
- android学习之菜单的子菜单的学习
- linux 程序包管理工具yum使用