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

  • 相关阅读:
    Hash详解
    手写2048
    20180429模拟赛T1——添边问题
    题解:UVA1025 A Spy in the Metro
    20180418模拟赛T2——Gym
    20180418模拟赛T1——Seq
    学习:中国剩余定理
    20180414模拟赛T2——拼图
    20180414模拟赛T1——BEAD
    学习:树状数组
  • 原文地址:https://www.cnblogs.com/lovers/p/4721823.html
Copyright © 2020-2023  润新知