腾讯微信事业部 后端开发 暑期实习生 7面

上周三约了HR面试,闲聊了半天,和技术面的套路差别很大。因为我说我实习想在北京,所以又约了这周一(今天)下午的一次北京同事的技术面试。北京这边应该就只有一个技术面试,还有HR面试。

视频面试采用牛客网平台,分为 项目、算法、数据结构、计算机基础。

算法题

逛街
小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。
小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)
输入描述
输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表每一栋楼的高度。
1<=n<=100000;
1<=wi<=100000;
输出描述
输出一行,包含空格分割的n个数字vi,分别代表小Q在第i栋楼时能看到的楼的数量。
示例1
输入
6
5 3 8 3 2 5
输出
3 3 5 4 4 4
说明
当小Q处于位置3时,他可以向前看到位置2,1处的楼,向后看到位置4,6处的楼,加上第3栋楼,共可看到5栋楼。当小Q处于位置4时,他可以向前看到位置3处的楼,向后看到位置5,6处的楼,加上第4栋楼,共可看到4栋楼。

LeetCode medium难度,秒杀,正反使用2次单调递减栈即可。需要注意的是,看到的楼包括当前楼,所以当前楼会正反计算2次,最后需要减1。

#include <vector>
#include <stack>
#include <iostream>

using namespace  std;

int main() {
    int n;
    cin >> n;
    vector<int> height(n);
    for (int i = 0; i < n; ++i) {
        cin >> height[i];
    }
    vector<int> ans(n, 0);
    stack<int> s;
    auto process = [&](int i) -> void {
        while (!s.empty() && height[s.top()] <= height[i])  {
            int t = s.top();
            s.pop();
            ++ans[i];
        }
        s.push(i);
        ans[i] += s.size();
    };
    for (int i = 0; i < n; ++i) {
        process(i);
    }
    while (!s.empty()) {
        s.pop();
    }

    for (int i = n - 1; i >= 0; --i) {
        process(i);
    }
    for (int i = 0; i < n; ++i) {
        -- ans[i]; // delete repeated self(count twice)
        cout << ans[i] << " ";
    }
    cout << endl;

    return 0;
}

数据结构

设计一个支持序列化和反序列话的HashMap。我之前没有接触过类似问题,了解过一些序列化的知识。就设计了一个 线型探查版 的hashmap, 因为这样所有数据都可以存储在一个数组中,方便序列化。

为了方便实现,并没有考虑泛化和扩容,虽然提前和面试官沟通过。面试官还是抨击了线型探查对空间利用有问题,说是单个bucket中有过多元素时会有问题。对此我并不苟同,然后有讨论了半天。最后他有怼我说,没别人实现的好,insert时没有考虑扩容。因为我之前已经和他沟通过不考虑扩容和泛化以简化问题。对此,面试官不免有些为了怼而怼的嫌疑,我是并不信服的。我问他别人怎么实现,主流方法如何?他只是说没有标准答案。

struct HashMap {
    const int capity = 1 << 7;
    array<int, capity> data;
    const int NOT_EXIST = -1;
    HashMap() {
        memset(data.data(), capity * sizeof(int), -1);
    }
    void searilize(const string& file_name) {
        // 把data内容写到文件中
        std::ofstream fout (file_name, std::fstream::binary);
        auto& d = static_cast<array<char, capity*sizeof(int)>>(data)
        std::copy(d.begin(), d.end(), std::istreambuf_iterator<char>(fout));
    }
    void load(const string& file_name) {
        // 把文件内容读到data中
        std::ifstream input(file_name, std::ios::binary );
        std::copy( 
            std::istreambuf_iterator<char>(input), 
            std::istreambuf_iterator<char>( ),
            static_cast<array<char, capity*sizeof(int)>>(data).begin());
    }
    int get(int key) {
        int hashcode = hash(key);
        int bucket = hashcode & 6;
        for (int i = bucket; i < 1 << 6; ++i) {
            if (data[i] == key) {
                return data[i + (1 << 6)];
            } else if (data[i] == NOT_EXIST) {
                return NOT_EXIST;
            }
        }
        return NOT_EXIST;
    }
    void insert (int key, int value) {
        int hashcode = hash(key);
        int bucket = hashcode & 6;
        for (int i = bucket; i < 1 << 6; ++i) {
            if (data[i] == NOT_EXIST || data[i] == key) {
                data[i] = key;
                data[i + (1 << 6)] = value;
            }
        }
    }
}

计算机基础

  • 多态。构造函数不能虚函数,析构函数可以虚函数。
  • 并发了解。

其他

自己的优点:
我讲了 基础扎实、算法好 (刷题多)。
他讲了他对刷题的看法。虽然不排斥刷题,但说了很多ACM选手的问题,工程实现考虑不周。感觉他有很多怨言呀。

他还问了为什么本科时成绩好,研究生时不那么好?
我如实说了,研究生成绩不重要。

面试官小哥哥早年也在北航读过书,最后我还聊了一下我实验室的现状。

#腾讯##实习##C++工程师##面经#
全部评论
7面不愧是微信🤣
点赞 回复
分享
发布于 2020-03-31 18:34
7面??离谱
点赞 回复
分享
发布于 2020-03-31 20:17
春招专场
校招火热招聘中
官网直投
点赞 回复
分享
发布于 2020-04-14 20:51
7面面的是马化腾吧...
点赞 回复
分享
发布于 2020-08-14 15:31

相关推荐

1.&nbsp;手撕算法给你一个数组,&nbsp;2&nbsp;1&nbsp;3&nbsp;7&nbsp;9&nbsp;2,如果相邻两个数相加是10,那么两个数可以消掉。问最后还剩几个数?比如这个,3和7消掉,还剩2&nbsp;1&nbsp;9&nbsp;2,1和9还可以再消一次,还剩2&nbsp;2,最后答案就是2。(思路:栈。新元素和栈顶元素相加为10,就弹栈,否则进栈,输出栈的大小。)2.&nbsp;项目●介绍水平分表过程、大表拆分的过程。●Redis有没有可能丢数据?怎么解决?●你还有什么其他的方式来保证Redis的可靠性?(主从复制、哨兵、集群一通甩出来)●RabbitMQ如何保证消息不丢失?(没保证,再加强)●RabbitMQ如何做削峰填谷?3.&nbsp;八股●InnoDB中一个三层的B+树能存多少数据?●MySQL的索引怎么存储的?每个索引一个B+树,还是多个索引放一个B+树?●每个叶子节点能存放多少条数据?(虽然没问,但是差点问到,mark一下,回去复习)●叶子节点中存的是什么数据?●B+树的范围查找怎么做的?●分库分表具体的分片策略是怎么做的?●表存满了之后怎么扩表?●id是怎么生成的?(分布式自增主键)●有没有其他的分布式id生成算法?(雪花),具体怎么实现的?(我不清楚,了解而已)●Redis保证incr命令原子性的原理是什么?(不清楚)●Redis数据的可靠性怎么保证?(持久化)●介绍AOF持久化的过程?●AOF重写期间命令可能会写入两次,会造成什么影响?(忘记了)●讲一下JVM的内存模型?●new一个对象存放在哪里?(运行时数据区),局部变量存在JVM哪里(不知道)●JVM垃圾回收机制?(没学到)●Linux系统的8080端口有多少个TCP连接,怎么看?(不知道)●如何看Linux进程或CPU使用情况?(top)●Linux查看内存情况?(free&nbsp;-h)●讲下TCP的TIME_WAIT(TCP最熟的地方忘记了,可惜)●ConcurrentHashMap底层是怎么实现的?●HashMap为什么不能保证线程安全?●进程间通信的方式?●共享内存的方式如何保证并发安全?(我的回答是加锁)●这个锁具体怎么实现的?(比较抽象,我回答了如果是我,我会怎么设计)4.&nbsp;反问●技术栈●对于实习生如何培养●GoLang在CSIG用来做什么?●Base成都?●作息?●团建?旅游?●实习生进来之后会做些什么?
点赞 评论 收藏
转发
4 18 评论
分享
牛客网
牛客企业服务