第二个offer, 腾讯前端

字节跳动面试完,就接到了腾讯的面试邀请,前前后后大概10多天吧,终于拿到了腾讯的offer(不得不说腾讯效率真比字节跳动低,字节跳动,一晚上三面,然后2天后就给我发offer了)

腾讯一面(电话面试):

估计自己面完字节跳动,感觉有点飘,觉得字节跳动这么难都能面的上,腾讯应该就很简单。一面的面试官,先是要我自我介绍,我就说自己xxx大学,现在大三,成绩年级第二,平常利用自己的空余时间学习了前端等等,然后要我说了说自己在大学做的一下项目,反正一共说了四个,从用c++到java到前端,每一个项目都给他详细的说了一遍,然后就是问一些前端基础了,比如说一下html的标签,css的属性(腾讯是瞧不起我咋地(╬▔皿▔)凸,问我种问题,这随口一说就二三十个的),然后问了一些css布局的东西,问了浏览器事件机制,问了常见的状态码等等,其他题目记不太清了,记得他还跟我说我的前端水平在校招生中是比较高的。然后问了几道思维题,具体题目记不清了╥﹏╥...,然后还问了快速排序,这个说了算法思想,时空复杂度,怎么实现的等等。最后他说我一面没问题,说二面的话会考我基础的算法能力,数据结构等等,要我准备准备。

腾讯二面(视频面试):
记得好像一面完一天后就给我发二面的消息,二面的话就考了我四道算法题(虽然自己很久没刷算法题了,但是底子还是有的,大一的时候非常热衷于刷算法题,天天做题,可惜的就是大一的时候没有参加acm (ノへ ̄、))。

第一题:给定两个字符串s1,s2,s2中出现的字符从s1中删除
思路:当时面试官要我选择自己擅长的语言写,我选了JavaScript

function remove(s1, s2) {
for (let i = 0, len = s2.length; i < len; i ++ ) {
 let r = new RegExp(s2[i], "g");
   if (r.test(s1)) {
    s1 = s1.replace(r, "")
    }
  }
 return s1 
}

当然自己当时脑子没转过弯来,没有想用c++咋做,用c++的话用个数组记就可以了

#include <iostream>
#include <string.h>
#include <string>
using namespace std;
const int N = 129;
string remove(string s1, string s2) {
    bool m[N];
    memset(m, 0, sizeof(m));
    string result;
    for (int i = 0, len = s2.size(); i < len; i++) {
        m[s2[i] - 'a'] = true;
    }
    for (int i = 0, len = s1.size(); i < len; i++) {
        if (!m[s1[i] - 'a']) {
            result.push_back(s1[i]);
        }
    }
    return result;
}
int main() {
    string s1 = "hahaacc", s2 = "bcabaccc";
    cout<<remove(s1, s2)<<endl;
    return 0;
}

第二题:判断一棵树是否为AVL树,我开始的思路就用一个递归记深度,一个递归判断是否为AVL树

#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
using namespace std;
const int N = 129;
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int val): val(val), left(0), right(0)  {}
};
int treeDeep(TreeNode* root, int d = 0) {
    if (!root) {
        return d;
    }
    return max(treeDeep(root->left, d + 1), treeDeep(root->right, d + 1));
}
bool isAVL(TreeNode* root)  {
    if (!root) return true;
    return (abs(treeDeep(root->left) - treeDeep(root->right)) <= 1)
            && isAVL(root->left)
            && isAVL(root->right);
}
int main() {
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->right->left = new TreeNode(4);
    root->right->left->left = new TreeNode(5);
    printf("%d\n", isAVL(root));
    return 0;
}

第三题:一个旋转的有序数组,求最小的值,比如12345 => 34512,最小值1。剑指offer原题,思路就是二分。

function min(array) {
    let left = 0, right = array.length - 1;
    if (array[left] < array[right]) return array[left];
    while (left < right) {
        let mid = parseInt((left + right) / 2);
        if (array[mid] > array[left]) {
            left = mid + 1;
        } else if (array[mid] < array[right]) {
            right = mid;
        } else {
            left ++;
        }
    }
    return array[left];
}

console.log(min([3,4,5,1,2]))

然后三道题大概20分钟吧就完事了,然后面试官看我做的挺快的,就给我出了第四题
第四题:求序列的一个子序列的最大和,比如[-1,2,3,4,-5], 那么子序列就是[2,3,4],最大的和为9
当时是***了,记得以前做过这道题,然后以为是动态规划来解,就一直按照动态规划的思路去做,然后还没做出来,就给他写了一个暴力的做法(ノへ ̄、)

#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1000000;
int dp[N];
int maxSum(int array[], int n) {
    memset(dp, 0, sizeof(dp));
    dp[0] = array[0];
    for (int i = 1; i < n; i++) {
        dp[i] = dp[i - 1] + array[i];
    }
    int _max = -99999999;
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            if (_max < dp[j] - dp[i]) {
                _max = dp[j] - dp[i];
            }
        }
    }
    return _max;

}
int main() {
    int arr[100] = {-1, 2, 3, 4, -5};
    printf("%d\n", maxSum(arr, 5));
    return 0;
}

当然这是超时的解法,回去和同学交流了一下,发现这道题其实直接for循环一遍就能求出结果o(TヘTo),果然自己还是菜啊
正确的解法:

#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int maxSum(int array[], int n) {
    int sum = 0, _max = -9999999;
    for (int i = 0; i < n; i++) {
        sum += array[i];
        if (sum < 0) {
            sum = 0;
        }
        if (_max < sum) {
            _max = sum;
        }
    }
    return _max;
}
int main() {
    int arr[100] = {-1, 2, -1, 3, 4, -5};
    printf("%d\n", maxSum(arr, 5));
    return 0;
}

当然面试的时候,面试官看我卡第四题卡挺久的,就让我去优化一下第二题,说我两个递归写有点不好,要我一个递归写,自己试了试,没写出来,就还是写了两个递归的方法┭┮﹏┭┮,果然自己还是菜啊。最后面试官跟我说前三道题答得挺好的,就是第四题写的不算太好。。。。

腾讯四面(视频面试):
其实自己觉得自己二面面的不太好,但腾讯居然还是给我三面了。记得三面是安排到了晚上9点半,然后面试官迟到了半个点,差不多晚上十点多才开始面试╥﹏╥...
面试官开始要我自我介绍,然后要我写大数相乘,当时我给面试官说,如果我用python,只需要像下面这样就可以实现大数相乘了

def multiply(a:int, b:int) -> int:
    return a + b

然后用Java的话,直接用BigInteger类就可以了,然后面试官说不让我用语言的特性,不用别人的包,还要我最好用C++写(。﹏。),虽然当时挺想用JavaScript写的,当然用C++也不难,就是模拟手算过程,就是类型转换有点麻烦。

#include <iostream>
#include <string>
#include <string.h>
using namespace std;
void frontFill(string &a, int n) {
    while (n --) {
        a = "0" + a;
    }
}

void backFill(string &a, int n) {
    while (n --) {
        a += "0";
    }
}

int char2Int(char ch) {
    return ch - '0';
}

string int2Str(int i) {
    string str;
    str.push_back(i + '0');
    return str;
}

string add(string a, string b) {
    int maxLen = a.length() > b.length() ? a.length() : b.length();
    frontFill(a, maxLen - a.length());
    frontFill(b, maxLen - b.length());
    string result;
    int acc = 0;
    for (int i = maxLen - 1; i >= 0; i--) {
        int cur = char2Int(a[i]) + char2Int(b[i]) + acc;
        if (cur >= 10) {
            acc = cur / 10;
            cur = cur % 10;
        } else {
            acc = 0;
        }
        result = int2Str(cur) + result;
    }
    if (acc) {
        result = int2Str(acc) + result;
    }
    return result;
}

string multiplyOne(const string &a, int n) {
    string result;
    int acc = 0;
    for (int i = a.length() - 1; i >= 0; i--) {
        int cur = char2Int(a[i]) * n + acc;
        if (cur >= 10) {
            acc = cur / 10;
            cur = cur % 10;
        } else {
            acc = 0;
        }
        result = int2Str(cur) + result;
    }
    if (acc) {
        result = int2Str(acc) + result;
    }
    return result;
}

string multiply(const string &a, const string &b) {
    string result = "0";
    for (int i = b.length() - 1; i >= 0; i --) {
        string temp = multiplyOne(a, char2Int(b[i]));
        backFill(temp, b.length() - i - 1);
        result = add(result, temp);
    }
    return result;
}

int main() {
    string a = "12345";
    string b = "12345";
    cout<<multiply(a, b)<<endl;
    return 0;
}

不得不说,牛客网的在线编辑器,太差了,一点变量提升都没有,写出变量名、方法名都不给提升,反正我前前后后不断的找错误、调bug,差不多20分钟还是给他写完运行了(/▽\)。
然后还给面试官讲了一个分治的方法,就是AB * CD 等于 (A * 10^(k) + B) * (C * 10^(k) + D)等于 (A * C * 10^2k) + (A * D * 10^k) +(B * C * 10^2k) + (B * D * 10^k),说白了就是将两个数字字符串不断的切成两半在用上面的公式去算每一部分,就是分治的思想,递归的过程,然后由于时间关系就没给他实现了,毕竟宿舍大晚上的还会熄灯。。。
接下来面试官还问了我一些设计模式,比如命令模式,不得不说命令模式我是多久没用过了,就跟面试官说,命令模式在JavaScript中并不常用,所以就给面试官讲了两个常用的设计模式,比如发布订阅模式、观察者模式,然后就要我实现这两个设计模式,先是写了发布订阅,观察者他就没让我写了。

class Event {
  constructor() {
    this.eventPool = {};
  }
  on (event, callback) {
    this.eventPool[event] ? this.eventPool[event].push(callback) : this.eventPool[event] = [callback];
  }
  emit (event, ...args) {
    this.eventPool[event] && this.eventPool[event].forEach(cb => cb(...args));
  }
}
const event = new Event();
event.on("err", console.log);
event.emit("err", "have error");

然后看我在简历上写了了解flutter就问我跨平台应用是怎么实现的,然后问了问JavaScript的闭包是咋回事,get和post的区别,常见的http状态码等一些比较简单的问题,最后他问了我一个比较开放性的问题,就是要我在电影院里建厕所,反正当时没理解题意,就照着自己的思路答,面试官也在一边笑,然后等我说完后,面试官就开始说他的思路,其实这不是一个简单的建厕所问题,而且微信服务器部署的问题,部署在哪,需要多少服务器是最好的,然后要我考虑正常情况下和高峰情况下需要多少服务器等等,最后就是我要多结合一些生活中的例子,其实互联网的很多思想都是来自于生活的。。。

腾讯HR面(电话面试):
差不多过了一个星期吧,HR终于给我打电话了,先是自我介绍,然后问我为什么学前端,学前端多久了等等,问我是如何选择实习的公司的,我说首先要看是什么公司,比如像腾讯这样的大公司我会优先考虑,然后在看什么部门,然后看同事是不是都是那种好说话的同事等等,然后还问了我的爱好,问了我性格啥的,问我碰到问题一般会怎么解决,还问我希望在腾讯收获些什么,我回答的比较low,就是平常自己一个人学前端太辛苦了,没有太多的方向感,只希望去到腾讯,和腾讯的前端大佬交流,跟着大佬学习(✿◕‿◕✿)。腾讯HR面试大概15分钟吧就面完了,感觉有点快。不过第二天还是给我下offer了,开心[]( ̄▽ ̄)*。
现在是拿了两个offer吧,字节跳动的直播中台部门,和腾讯的企业微信,现在感觉有点选择困难了,感觉两个都是比较好的部门。当然还想继续保研,毕竟自己成绩也是够的(●'◡'●)。

#腾讯##面经##实习##前端工程师#
全部评论
牛🍺🤣
4 回复 分享
发布于 2019-04-28 16:28
连着把你头条和腾讯的帖子都看了,看的吓得我手抖,我好像是学了个假的前端,SSR都没听过😑
2 回复 分享
发布于 2019-07-19 18:45
大佬
1 回复 分享
发布于 2019-04-28 16:33
蹭蹭,话说是HR面要等那么久的吗,等了一个星期
1 回复 分享
发布于 2019-04-28 16:32
大佬请问一下,你是怎么兼顾技术栈和课内学习的呢,技术又好又保研,这也太强了吧
点赞 回复 分享
发布于 2022-12-19 20:58 广东
我甚至怀疑我的面试官和你同一个 今天我又问道建厕所的问题... 我怀疑我的面试题库都来自这里
点赞 回复 分享
发布于 2020-04-10 20:23
感觉我的面试和大佬的面试就不是一个量级的hh
点赞 回复 分享
发布于 2020-04-08 06:24
&两道题今天做到了 但自己没写好😥
点赞 回复 分享
发布于 2020-04-08 00:47
我感觉我就是来凑数的,好难
点赞 回复 分享
发布于 2020-03-25 00:31
老铁,咋二面之后是四面呢?是我看错了吗?🤣我接到腾讯第四次面试邀请(第三次复试),不知道是不是被原部门放弃了😂另外捞的,就想找找同类遭遇问问看
点赞 回复 分享
发布于 2020-03-04 14:16
校友小弟软件18级
点赞 回复 分享
发布于 2020-01-17 16:24
厉害!
点赞 回复 分享
发布于 2020-01-11 06:59
2面第四道题还是错的
点赞 回复 分享
发布于 2020-01-04 09:08
蹭蹭大佬欧气,祝我拿到腾讯offer
点赞 回复 分享
发布于 2020-01-03 13:14
校友巨佬,下午就腾讯三面了,蹭一蹭你的欧气
点赞 回复 分享
发布于 2019-10-15 12:22
学前端要求C++吗?😭😭
点赞 回复 分享
发布于 2019-07-19 18:59
校友**
点赞 回复 分享
发布于 2019-04-29 13:13
大佬tql,全能型选手
点赞 回复 分享
发布于 2019-04-28 18:17
大佬的代码能力确实强
点赞 回复 分享
发布于 2019-04-28 18:06
你好厉害啊
点赞 回复 分享
发布于 2019-04-28 17:56

相关推荐

关于我大学本科四年,想了很多,但还是不知道该怎么动笔&nbsp;“大学四年,是我从懵懂少年走向职场青年的转折期。这一路跌跌撞撞,有迷茫,有遗憾,也有成长和决心。”&nbsp;大一刚进来时仍然有高中那股学习劲,经常一个人去图书馆学高等数学,但后面劲头一过便开始在宿舍开启躺平生活(现在想想那段时间真的很爽,无忧无虑)。由于大一担任班干部,所以经常要跟其他班的班干部交流,在此期间认识了隔壁班的一位女生,短发而很可爱,因为很多团建还有比赛都是我们两班一起参加的,而且我和她都是负责人,所以交集很多,后面慢慢地彼此对产生了好感,所以在大一刚开学的2个月后,我们在一起了,彼此之前都是初恋。但当时我真的是太太太直男了,对感情的想...
真烦好烦真烦:骗哥们可以,别把你自己也骗到了就行。哥们被你骗了真无所谓的,打个哈哈就过了。但希望你打完这段话后擦一下眼角,别让眼泪掉在手机屏幕上了就行。你说的这些话,哥们信一下也是没什么的。还能让你有个心里安慰,但这种话说出来骗骗兄弟就差不多得了,哥们信你一下也不会少块肉,但是你别搞得自己也当真了就行。哥们被你骗一下是真无所谓的,兄弟笑笑也就过去了。真不是哥们想要破你防,你擦擦眼泪好好想想,除了兄弟谁还会信你这些话?
点赞 评论 收藏
分享
面试官人很好,态度和蔼可亲,没答出来时也会引导你去思考。由于是晚上面的,导致我白天一天都有点紧张,面的时候状态也不是很好,正常可能面试官提问完应该思考几秒再答,而我就像抢答一样一口气把所有会的都说出来,这样就导致逻辑比较混乱,东一句西一句的。首先是自我介绍,先把会的技术大致讲一下,由于我八股背的多所以着重讲了一下,Java,go,jvm,MySQL,Redis,计网,操作系统这些,然后一小部分闲聊,然后先问了一下项目,面试官问我这个项目是否落实之类的,直接坦言说是写的练手的,包括之前也写过IM通讯,外卖之类的。然后面试官就把提问的重点放在了八股上。先问了Java:类加载器(答:3种+自定义类加载器、tomcat、原因+双亲委派+好处)JVM参数(答:xmx,xms,newsize这些,问我是如何设定的,我回答是把内存分一半给堆,再把堆分一半给新生代,这方面确实不太了解)然后问了一下并发相关的:线程池(答:线程池的7个参数(忘了线程工厂和阻塞时间了),3个重要参数,还有线程如何启用,为什么要设计最大线程数之类的,提到Java栈默认分配1MB运行时不可以更改)AQS(答:先讲clh是自旋锁+list,然后是AQS在这个基础上做的两个优化,然后举了一下reentrantlock根据state如何获取资源)CAS(答:使用三个字段,aba问题,然后将通常搭配自旋锁实现,面试官问通常会自旋多少次,这个不太了解,答的100,然后问100次大概多少秒,回答微秒级,然后面试官讲了一下怎么做资源可能没用完,意识到可能还需要进行阻塞操作)然后考虑一下Linux命令(top,ps,如何使用管道符过滤线程和使用Linux启动线程没答出来)然后问Redis:持久化机制(答:三种aof,rdb,混合,aof的三个参数刷盘策略,rdb以快照保存,使用bgsave会使用子线程来保存不会阻塞,而aof虽然会阻塞但是只在写完数据后追加一条命令,不会太影响,然后是他俩的优缺点,还有混合是怎么保存数据的)集群模式(答:三种,主从复制到缺点再到哨兵机制,正常使用三个哨兵互相监督,主节点挂了投票选主哨兵然后选主节点,然后额外讲一下脑裂的问题,主节点进行数据更新然后把命令写入aof来同步从节点,最后cluster集群,如何实现,使用16383个哈希槽(艹答成16384了),先根据哈希码取余,再根据节点数取余决定放在哪个节点上,然后问了一下我会怎么选集群模式,首先是cluster的问题,会让管道操作之类的失效,然后哨兵会导致整个集群结构变得复杂,使用小项目可能会考虑哨兵,大的考虑cluster,然后考了一下cluster如果一个节点挂了怎么办,根据节点数重新取余然后数据转移,面试官说这么转移比较慢,有没有别的办法,我隐约记得使用一个类似环形数组的方式,想不起来了)然后考了一下MySQL的b+树(这方面的知识点太多了,导致我什么都想讲逻辑就比较乱,讲了一下聚簇索引,树的叶子节点对应着一张页16KB,MySQL有一个区的概念,把这些页放在同一个区中,这样叶子节点的双向链表遍历时速度更快,然后b+树的扇出比较大(非常二,说成扇度之类的,面试官以为说的是扇区)这样层数就比较小,一行1kb数据的话3层可以放心2000w数据)其他的暂时想不起来了算法是lru,面试官问要不要提示,我说写个,然后写了10分钟左右,说大概写好了,但是面试官指出了2个小错误,第一个马上就改回来了,第二个一直没看出来(大脑这时候已经停止工作了)反问:问学习建议,说根据实际的项目进行深入,考虑应该怎么做,还问了一下组里面是做Java的吗?面试官说他是做go的,组里什么语言都有,语言影响不大,连忙补充了一句我对go的底层有深入源码的学习)结束。总体感觉答得不太好,没有太体现出深度,细节也不够全面。
下一个更好呗:佬,我投完云智一直没消息,多久约的一面啊
查看14道真题和解析
点赞 评论 收藏
分享
评论
12
156
分享

创作者周榜

更多
牛客网
牛客企业服务