京东岗位我报的有点魔幻,我从事C++岗位的,牛客上写Golang要求C++或者Go其中一种,直接就报了。
还是太年轻,笔试大多都go的题,收到面试走*运(全都是蒙的,算法题只写了第一道)。
京东一面(40min):
(1)如何判断链表有环(快慢指针,一个跳1,一个跳2,我回答的拓扑,很尴尬,一度尴尬,互相傻笑)。
(2)计算机网络有几层,传输层的协议。(普遍接收的五层,TCP/UDP)
(3)写一个二叉树中序遍历
(4)Python中with的用法
京东二面(1h):
(1)多个有序链表合并(我用的优先队列)。复杂度nlog(k),用c++写的,感觉他们很抠我的实现,以后实现要严谨一点。
(2)手写高精度乘法。这个我有点小惊讶,打acm的时候一直用的是模板,写过两次但是都得debug好一会,不过还好这次是写出来了。
战果展示:
#include<bits/stdc++.h>
using namespace std; const int maxn = 1e5+10;
string add(string xx,string yy){
//615yy 4920xx
reverse(xx.begin(),xx.end());
reverse(yy.begin(),yy.end());
string res="";
if(xx.size()<yy.size()) swap(xx,yy);
int mm=max(xx.size(),yy.size());
int mi=min(xx.size(),yy.size());
int jinwei=0;
for(int i=0;i<mm;i++){
if(i>=mi){
int t=(xx[i]-'0'+jinwei)%10;
jinwei=(xx[i]-'0'+jinwei)/10;
res+=t+'0';
}
else{
int t=(xx[i]+yy[i]-'0'-'0'+jinwei)%10;
jinwei=(xx[i]+yy[i]-'0'-'0'+jinwei)/10;
res+=t+'0';
}
}
if(jinwei) res+=jinwei+'0';
reverse(res.begin(),res.end());
return res;
}
string mul(const string &xx,const string &yy){
//123 45
string base="";
string tmp="";
string res="0";
for(int i=yy.size()-1;i>=0;i--){
base="";
int a=yy[i]-'0';
vector<int> t;
int jinwei=0;
for(int j=xx.size()-1;j>=0;j--){
int b=xx[j]-'0';
t.push_back((a*b+jinwei)%10);
jinwei=(a*b+jinwei)/10;
}
if(jinwei) t.push_back(jinwei);
reverse(t.begin(),t.end());
for(auto k:t){
base+=k+'0';
}
base+=tmp;
cout<<base<<endl;
tmp+='0';
res=add(res,base);
}
return res;
}
int main(){
// string res=mul("3","4");
// cout<<res<<endl;
string res=mul("1234","45");
cout<<res<<endl;
}
收获:面试官让实现代码,冲着能正确运行去实现,不能只是把思路走一遍。每个面试官要求不一样,最后可能会抠细节甚至去考虑你没有特判的情况。所以起点和对自己的要求要高一点。这次传参数面试官提示我传const引用,平时写题总是忽略这个,一个良好的代码习惯也十分重要。
网易一面(1h):
(1)每次一步或者两步,输出到n的所有情况,不能用递归(bfs)
(2)TCP/UDP区别
(3)链表给你个t,小于t的放到左边,大于t的放到右边(这个找到第一个大于的,然后后面小于的一直往这前面插入就可以了,需要细心)
收获:面试官知道acm选手的弱点,就是指针和链表。他故意出了个这种题给我,我bug最后也没调出来,挺扣分的。
老实说,我感觉没怎么去专门写过链表,指针的这些操作,这些最基本的,效率最高的实现方法还需要继续去学习。