搜狗笔试

来源:互联网 发布:软件详细设计说明书 编辑:程序博客网 时间:2024/04/29 20:52
搜狗笔试 来源:袁立舟的日志

时间90分钟,题目都是曾经出过的。搞。

算法题:

1. 有400w个数对(unsigned int ,unsigned int) ,设计一个存储结构,尽量高效的实现存储和查询。

    采用一个multimap来存储该数对集合。但这个STL已有的东西,没有体现出自己的设计思路。

 

2.1w台机器每台1w个数,寻找1w个最小的数。

思路一:

    s1.每台机器进行一次排序,生成1w个最小堆。//愚蠢!!一个数组存就好了,以后不再需要任何调整了。

    s2.输出s1最小堆的根元素,并从堆中删除,然后调整堆。

    s3.从s2中输出的最小元素所在的机器的堆中的下一个最小元素插入s2的堆中,调整之,并输出下一个堆顶。如此循环一万次。

思路二:

    归并排序。

    1.还是先在每台机器内排好序。然后每两台机器之间进行归并,比较1w次即可。

    2.这里的策略比较纠结,由1得到5000个归并好的大小为1w的数串。然后是2500个。10000-5000-2500-1250-……1,最后是1个大小为1w的数串。次数为log2(1w)即lgn,由于是并行,每次的时间是n(n=1w),不计I/O的话复杂度是nlgn。

 

3.abcd和bacd属于同一个变位词集。给定一个词典,跟据变位词对其进行归类。

  思路一:

    1.定义一个map[26],每个值都存为一个素数,即26个互不相同的素数,尽量小。如果单词很长的,可能会超过0x70000000(32位机),这个情况没有考虑。

    2.在定义一个multimap<int,string>,Key=dict[i]的所有值的乘积,即for(int j = 0;i<dict[i].size();i++) key*=map[dict[i].charat(j)-'a'];string存储该字符串即dict[i],i belong to[0,MAX),MAX字典的总条目数。

    3.根据该multimap的equal_range(key)方法可以得到所有Key值相同的字符串的集合,即key代表一个变位词集合的索引。

思路二:

    STL中有个算法,bool next_permutation( iterator start, iterator end );    

    1.对字典所有的单词进行一次qsort。

    2.在一个循环里,如果一个单词的next_permutation为true,遍历字典…… 算了这个算法还是太费时间了。

 

简答题:

1.构造函数里能使用虚函数吗?不能超前消费

2.C++什么时候实现拷贝构造函数?这道题的意思没有特别理解。

 再附个选择题,齐了。

1: call by value和call by reference的区别?
A: call by value复制了实参,而call by reference相当于使用了实参的别名。

2: 下列哪种操作可能带来死锁?A: C(可能在第二个lock(m1)产生死锁)
A: lock(m1) lock(m2) unlock(m1) unlock(m2)
B: lock(m1) lock(m2) unlock(m2) lock(m2) unlock(m1) unlock(m2)
C: lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1)
D: lock(m1) lock(m2) unlock(m1) unlock(m2) lock(m1) unlock(m1)

3: 外部排序常用的算法?A: A
A:归并排序 B:快速排序 C:堆排序 D:希尔排序

4: 在对空间和时间都有限制的实时系统中,常使用的排序算法?A: B
A:插入排序 B:堆排序 C:快速排序 D:归并排序

5: 高度为1的平衡二叉树节点为1个,高度为5的最少多少个?A: 12
F(n)=F(n-1)+F(n-2)+1

原创粉丝点击