Part 1: 项目
- 滴滴实习相关
- NLP竞赛内容
- 研究生的研究内容
Part 2: Java
先问我在滴滴用过GOLANG?我说忘了。
- Java如何实现面向对象(回答封装继承多态)
- 子类能否使用使用父类的普通方法、构造方法?
- 单例模式(描述了Hungry, Lazy, 双检锁)
Part 3: MySQL
- 统计一个班级的数学平均分(上来不知道瞎写了个什么东西…面试官表示莫名其妙
select class_id, avg(math) from grade group by class_id;
Part 3: Redis
- Redis存储类型(5个基本+bitmap, geo相关)
- Bitmap => 场景:如何统计哪些网站爬取过?(不会,说了个哈夫曼编码,好离谱。最后反问环节面试官说ASCII+CRF或者布隆可以解决)
算法
1. 求全排列(回溯法)
#include <vector>
#include <string>
using namespace std;
// 回溯
vector<vector<char> > ans;
vector<char> path; // 构造中的全排列, 可以直接用string类型
void backtrack(string s, vector<bool>& visit){
if(path.size()==s.size()){
ans.push_back(path);
return ;
}
for(int i=0; i<s.size(); i++){
if(!visit[i]){
visit[i] = true; // 标记已访问
path.push_back(s[i]);
backtrack(s, visit); // 递归后续
visit[i] = false;
path.pop_back(); // 恢复
}
}
}
vector<vector<char> > main(string s){
vector<bool> visit(s.size(), false); // 初始化false
backtrack(s, visit);
return ans;
}
2.最长非递减连续子串
思路回答了dp+pre数组,然后他说有没有更直观的,回答直接双指针遍历一遍就可以(MS一面也是这个题,我还傻乎乎的写dp…)
提交运行发现没有考虑多个答案,面试官说没关系
#include <string>
#include <iostream>
using namespace std;
string LIS(string s){
if(s.size()<=1)
return s;
string ans = "";
int left = 0;
int right = 0;
while(right < s.size()-1){
// 继续增长
if(s[right+1]>=s[right]){
right++;
// 更长子串则更新
if(right-left+1 > ans.size()){
ans = s.substr(left, right-left+1);
}
}
// 归零, left,right移到下一位置
else{
left = right+1;
right = right+1;
}
}
return ans;
}
int main(){
string s="8913571356";
cout<<LIS(s)<<endl;
return 0;
}
总结
这一面的面试官就有点残酷了,上来问了两个go,心态搞崩了,还好后面算法题比较简单。
准备了一周的多线程一个没问…可能因为字节不太用Java吧,所以框架至今也没被问过。
第二天通知准备三面,面试字节第一次走到这么远。。。希望三面继续lucky吧。