时间:2015-08-11 10:00 ~ 11:30
地点:知春路甲48号盈都大厦B座11层今日头条
1. 二分查找算法
我先写了一个递归的,然后面试官又让我写一个非递归的。
递归:
int BinarySearch(int A[], int from, int to, int target) { if (from < to) return -1; int m = (from + to) / 2; if (A[m] == target) return m; else if (A[m] < target) return BinarySearch(A, m + 1, to, target); else return BinarySearch(A, from, m - 1, target); }
非递归:
int BinarySearch(int A[], int size, int target) { int left = 0; int right = size - 1; int m; while (left <= right) { m = (left + right) / 2; if (A[m] == target) return m; else if (A[m] < target) left = m + 1; else right = m - 1; } return -1; }
2. sizeof 类 的大小:
class A { const int a; } // 问sizeof(A) 是多少?
答案是4个字节。面试官这里想考察虚函数的原理。
该类型的题目总结在这里:C++ 对象的sizeof问题
3. 写一个Singleton模式,以及需要注意的问题。
class Singleton { public: static Singleton * GetInstance() { if (_instance == NULL) _instance = new Singleton(); return _instance; } private: static Singleton * _instance; }
这个是最简单的Singleton,需要注意的时多线程情况需要使用锁。
Singleton的总结:设计模式--Singleton
4. 算法题:有两个文本文件,文件A是一个关键字文本,该文本中包含10w个关键字(可以使中文哦);文件B是一个内容文本,例如新闻吧,大概占硬盘1GB空间,也就是说非常大。问题是遍历文件B,输出所有遇到的文件A中的关键字的位置。(包括子串)
例如:
文件A
china
abc
abcdef
abdd
xyz
文件B
china is abcdef, xyz is aabcdef, ....
0 9 16 24
注意:需要包括子串,例如"aabcd" 就匹配到了关键字"abc"。
我的想法如下,(我只考虑到了英文的情况),对文件A中的关键字建树。如下,
a c x
b h y
c [1] d i z[1]
d[1] e n
f[1] a[1]
注:[1]表示从根节点到当前节点是一个单词。
接下来遍历文件B中的字符串,遍历过程如下:
当前字符 当前是否为一个单词 之后的合法的字符
c 否 h
h 否 i
i 否 n
n 否 a
a 是 所有根节点,即a,c,x
i 否 NULL 非法, 因为没有为"i"的根节点
s 否 NULL 非法,因为没有为"s"的根节点
a 否 b
b 否 c
c 是 所有根节点,即a,c,x 或者 继续 d
d 否 d,e
e 否 f
f 是 所有根节点,即a,c,x
... ... ...
但是我没有考虑到中文。面试官提醒了好几次。可以将中文转换成拼音,然后按照上面的方法继续。但是中文拼音是有歧义的,如 "jishi" -> "计时", "及时", "即使"等。这时候需要在每个单词后面缀上对应的关键字,用来排除歧义。
例如,
j
i
s
h
i -> "计时", "及时", "即使"
对于中文的情况还需要完善下。
5. 算法题:有N个数组,每个数组最多包含M个整数,每个数组都是排好序的。
[0] 1 2 3 9999 999999
[1] 0 10000 111111
[2] 3 7 9 11 22 33 44 555
[3] 5 9 100 112 333
求所有数组中出现的整型。
我的答案是两个数组依次merge。
面试官的答案是:每次merge N个数组。
6. 算法题:一个字符串 "abcdcddeefefghi...",求其中连续的三个字符的最大长度。
例如:题目中的最长的连续的三个字符是:“ddeeffef”,长度为8。
需要补充。
7. 看多的C++的书籍。
《C++ Primer》
《C++程序设计语言》
《Effective C++》