0 0

一个TXT文件中包含百万数字,每个数字一行,请从中选出最大的十个数. 这是一道java面试题。10

这是一个java面试题,
不太会,就蒙头写了一个。如下:
读出来,分组每1000个选10个,1000次。

不知道靠不靠谱,
请指点,多谢!
2013年3月14日 21:18

14个答案 按时间排序 按投票排序

0 0

采纳的答案

同意502220545说的使用数组,只是不需要再进行排序,只需要再定义一个变量保存数组中最小的一个数,每读取一个数据就与这个最小的数进行对比,如果大于这个最小的数,那么将数据中等于最小数的一个数据替换为刚刚读出的数,然后再从数组中得到最小的数更新到最小数的变量中,然后继续循环,这样就可以省掉比较数组和排序的工作了。


public static void main(String args[]) {
try {//暂且不考虑文件是否存在以及文件内容是否正确的问题
BufferedReader br=new BufferedReader(new FileReader("D:/Test.TXT"));//读取文件
int min=0,num=0;//最小值和当前值
int[] big=new int[10];//最大值数组
for(int i=0;i<10;i++) {//初始化数组
big[i]=Integer.parseInt(br.readLine());
}
min=getMin(big);//得到最小值
for(String s=br.readLine();s!=null;s=br.readLine()) {//遍历文件所有的数值并更新big数组
if(s.equals(""))continue;
num=Integer.parseInt(s);
if(min<num) {//如果当前值大于big数组中的最小数值
replace(big,min,num);//将当前值替换掉数组中的一个最小的数值
}
}
br.close();//关闭
} catch (Exception e) {
e.printStackTrace();
}

}
/**
* 将数组中等于 min的一个数值替换为big
*/
public static void replace(int[] arr,int min,int big) {
for(int i=arr.length-1;i!=-1;i--) {
if(arr[i]==min) {//找到符合条件的数值,并替换
arr[i]=big;
break;
}
}
}
/**
* 得到数组中最小的数值
*/
public static int getMin(int[] arr) {
int min=arr[0];
for(int i:arr) {
if(min>i) {
min=i;
}
}
return min;
}

2013年3月15日 11:16
0 0

可以考虑一下BitSet

2013年3月19日 14:16
0 0

使用treeMap直接将值读进去,treeMap是自动排序的。。

如果是降序那就直接去前10个

如果是升序那就直接去后10个

2013年3月19日 12:44
0 0

请参考一下RandomAccessFile及线程运用,相信很快能找到答案的.

2013年3月16日 16:18
0 0

我觉得用脚本来实现这个比较快捷。

我可以先定义 一个数字 , 比如说是50, 数字字符长度超过50的 我输出到一个新的TXT里面去。

如果数据超过10个了,我就在新文本里面继续做排序。
如果小于10个,我就把这个50数字改小点重新读取一次TXT。

2013年3月15日 14:51
0 0

都是数字。。。 那就先对比字符串长度啊。。。 然后取最长长度的几十个放数组里面在对比下好了。

2013年3月15日 14:47
0 0

直接进内存啊,如果是整形,也就几十兆。

2013年3月15日 14:32
0 0

做一个10个元素的小顶堆,用堆排序的方法。
典型的Top K问题。

2013年3月15日 12:51
0 0

mapreduce
多线程 用RandomAccessFile把文件分块,获取每块文件的最大10个数,然后再统计出所有块中最大的10个数

2013年3月15日 11:46
0 0

首先全部读取到数据库里面,然后想怎么搞就怎么搞,

2013年3月15日 10:04
0 0

1楼所说基本正确,文件以流的方式读入内存,不管多大的文件都不会消耗很多内存,每次读入的数字和原来的数字对比,保留最大的十个即可。
我估计算法使用的总时间几乎和读取一次这个文件的时间一致,因为10个数字排序消耗的时间和IO操作相比几乎可以忽略不计。

2013年3月15日 09:56
0 0

一点拙见:
   1.读取 每行  用固定的字节数  这样应该不会有内存溢出的问题
   2.然后用一个10个长度的数组 存取 取出一个 插入一个  按升序排序
   3. 当取出第11个的时候 和数组中的数据比较 插入适当的位置

2013年3月15日 09:21
0 0

正好有那么一个组,里面有1000个0,这个你是不是也要统计进去?

2013年3月15日 09:06
0 0

想法跟你一样 求高效率算法

2013年3月14日 21:34

相关推荐

Global site tag (gtag.js) - Google Analytics