面试道题之四道

来源:互联网 发布:淘宝退差价怎么退 编辑:程序博客网 时间:2024/06/04 17:54

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

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

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

4:给定一个日期2031-7-2,求出该日为星期几(已知2002-3-28为星期四)。

(一)

4:给定一个日期2031-7-2,求出该日为星期几(已知2002-3-28为星期四)。 算出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,然后再根据排序算法找到中位数。
4:通过Calendar来计算

4:

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.

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为星期四这个条件也就没有用了

(三)

private string week()//2002-3-28,2031-7-2
    {
        DateTime dt = new DateTime(2031, 7, 2);
        string s =  dt.DayOfWeek.ToString();

        return s;
       
    }

(四):

Date,来解答最后一题,思路从题中可以知道2002年3月21是周日
于是直接先将2031.07.02与2002.3.21解析成毫秒数,算出这段时间里相差多少毫秒,再将毫秒数除以一天的毫秒数(24L*60*60*1000)转换为天数,即求出了,这两段时间相差多少天,再%7即可。
省去了还要考虑闰年,平年等一些问题。
呵呵,刚学,有的还不会表达,附上代码

public class Date
{
public static void main(String[] args) throws Exception
{

java.text.SimpleDateFormat f = new java.text.SimpleDateFormat("yy年MM月dd日 HH:mm:ss");

f = new java.text.SimpleDateFormat("yyyy.MM.dd");
java.util.Date m = f.parse("2002.03.31");
java.util.Date n = f.parse("2031.07.02");

long x = ((n.getTime() - m.getTime())/(24L*60*60*1000))%7;
System.out.println(x);
}
}

收集于csdn博客

http://topic.csdn.net/u/20090806/16/72971F41-0EE8-48C3-BBD9-43572A78AD1F.html


 

原创粉丝点击