日期:2014-05-20  浏览次数:20780 次

今儿面试的几道题,大家帮看看
1.有1亿个浮点数,请找出其中对大的10000个。提示:假设每个浮点数占4个字节,1亿个浮点数就要站到相当大的空间,因此不能一次将全部读入内存进行排序。 

2:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。 

3:有一篇英文文章(也就是说每个单词之间由空格分隔),请找出“csdn”着个单词出现的次数,要求效率最高,并写出算法的时间级。 

4:给定一个日期2031-7-2,求出该日为星期几(已知2002-3-28为星期四)。只要求说明思路,不要写java code

------解决方案--------------------
4:给定一个日期2031-7-2,求出该日为星期几(已知2002-3-28为星期四)。只要求说明思路,不要写java code
这个可不可以 算出2002-3-28 和 2031-7-2 一共相差多少天,然后 取余 7 。 就能算出来周几
------解决方案--------------------
4)根据润年的规律,2031年7月2和2003年一样7月2一样,4年一润的。02年的3月28比03年的3月28差一天(原因是:365%7=1)这就意味着,03年的3月28是周5,按照月之间的差距,小月(就是30天)=4周+2天。大月=4周+3天,3月和7月差4,5,6三月,总体差2+3+2=5天。所以,2003年7月2日就是周5+5天=周3(一个循环)。所以。2031年7月2日是周3
------解决方案--------------------
1、将这1亿的数字,放在文件中,然后分段读取,每次读10000个,在10000个中取最大,跟下次10000个比较。这样依次。
2、通过BufferReader来读,预先分配适当的buffer,然后再根据排序算法找到中位数。
3、
4、通过Calendar来计算。

------解决方案--------------------
Java code

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date d = sdf.parse("2031-7-2");
            sdf = new SimpleDateFormat("EEE");
            String str = sdf.format(d);
            System.out.println(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
//输出结果 : 星期三

------解决方案--------------------
我的思路:
1.假设每次只能放入20000个到内存排序。每次载入20000个,留下大的10000个。做5000次。然后再两两组合成20000个排序留下最大。每趟排序去掉10000个,所以一共要做9999组排序。
2.大概思路是将10G数按文件储存顺序分成10组1G的数,然后将2G内存当作一个移动窗口,每次读入2G的进行排序,每次排序完换进低位的1G个数,换出高位的1G个数。一共要做9*9=81次大的排序。
3.两个指针,一个指着文章A,一个指着对比串B,因为已经给出CSDN这个特殊没有重复字母字符了,可以得出要比较的次数就是文章长度A.LENGTH。不是特殊情况就是A.LENGTH*B.LENGTH.
4.比较罗嗦,关注
P.S 我的1.2题解法除了内存外还用了人家硬盘空间,等待高手更好的方法。
------解决方案--------------------
1.有1亿个浮点数,请找出其中对大的10000个。提示:假设每个浮点数占4个字节,1亿个浮点数就要站到相当大的空间,因此不能一次将全部读入内存进行排序。 

答:
1.每100万个一组,读到内存(大约要4M内存)中,构建大顶堆,把堆顶(最大数)和文件号记录到一个100大小的数组A,再写回到磁盘,形成一个文件,这样共形成100个文件。
2。这时,A数组也添满了,再对这A数组建大顶堆。
3.堆顶A[0]输出。
4.对堆顶对应的文件(同文件号确定)去掉堆顶后重新调整堆,再把新的堆顶放到A[0].
5.对A调整堆。
6. 对2~4步循环10000次,最大的10000个数就选出来了。

2:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。

答:
简单的说.
1. 每次读入500M个整数用快速排序排序。存为文件。
2.把产生的20个文件用归并排序两两合并,直到归为一个文件。
3.在文件中找到第5G和第5G+1个数,求这两个数的平均数即所求。


3:有一篇英文文章(也就是说每个单词之间由空格分隔),请找出“csdn”着个单词出现的次数,要求效率最高,并写出算法的时间级。 

答:
1.把整个文章存入char[]数组chars。
2.根据下标变量index扫描chars。
3.如果chars[index]==' ' && chars[index+1]!=' ';则从index+1开始判断接下来的四个字符是不是csdn.只要有一个不匹配,或者下一个字符是空格,则不再匹配。如果全匹配则counter++.
算法的时间复杂度为O(n) n为文章的长度。和“csdn”没有关系,index不会有重复的值。

4:给定一个日期2031-7-2,求出该日为星期几(已知2002-3-28为星期四)。只要求说明思路,不要写java code

答:
1.根据条件,2002-3-31为星期日.
2.从2002-4-1开始统计到2031-7-2的天数counter。
3.2002年 4,5,6,7,8,9,10,11,12月数加起来30*9+5=275天。
4.2003~2030年的天数=365*(30-3+1)+30/4
5.2031年的天数,1~6月的天数=6*30+3-2
7.20031年7月的天数为2.
8.上面3~5的天数之和放入counter.
9.counter%7为0是星期天,其它情况是几就是星期几。

我估计不让用Calender。用Calender就简单了。2002-3-28为星期四这个条件也就没有用了。
------解决方案--------------------
探讨
4:给定一个日期2031-7-2,求出该日为星期几(已知2002-3-28为星期四)。只要求说明思路,不要写java code
这个可不可以 算出2002-3-28 和 2031-7-2 一共相差多少天,然后 取余 7 。 就能算出来周几

------解决方案--------------------