2015-08-11 [今日头条]--数据抓取和处理工程师--1面

时间: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 {

publicstatic 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++》

原文地址:https://www.cnblogs.com/lovers/p/4721823.html