3.4 腾讯提前批后台开发实习生(C++)
大概晚上八点十分左右,刚从图书馆出来,没走几步,就接到了一个座机电话,广东深圳固话,猜到了是腾讯,不过还抱有一丝希望,接了之后,对方声音很小,不过还是听到了:现在方便吗?能怎么说?只能说我这边有点吵,我找个安静的地方,其实是平复心情。。。
Question 1
看到你以前不是这个专业的,那可以说说你应聘这个职位的优势在哪里吗?
Question 2
看你的简历,你比较熟悉C++对吧(嗯,是的),那可以简单说说多态吗?
Question 3
用过C中的strcpy函数吗?它有什么弊端呢?那怎么用一句代码来判断是否发生内存重叠呢?有看过它的源码吗?(有),那除了内存重叠还有什么弊端?
Question 4
了解计算机网络吗?(了解),做过有关网络的项目吗?(没有),那可以简单说说TCP/UDP有什么区别吗?TCP的三次握手为什么是三次而不是2次或者4次?
Question 5
数据库了解吗?(了解,之前做过项目用到了sqlite)。奥,那还了解别的数据库吗?(嗯,了解一些mysql,以前看过一点redis)。那可以说说它们的区别吗?
Question 6
linux了解吗?(了解一点。。。)。都用过什么命令?(没搞过项目,只用过简单的命令,cp,ls,mkdir等)那怎么查看进程的CPU状态?(嗯,不好意思,不知道)。
Question 7
差不多就是这样了,你有什么想问我的吗?
看着26分钟的通话记录,只能苦笑了,问我的东西其实平心而论不难,很多自己也准备了,但就是平时眼高手低(这个词高中时老师就说过无数次),看了就过去,没有真正掌握,没有自己做好练习。最想去的公司第一次面(人生第一次电话面试)还是在最差的状态,腾讯开启了找实习的第一枪,表现的要多差有多差,但总归还有机会,4月的正式批等我。
3.12 PCG电话面(C++后台开发)
可实习时间
自我介绍
研究的课题
介绍一个项目
用的数据库
有看过sqlite保存的文件吗?存的数据生成的文件
熟悉SQL语句吗?项目中用到了什么语句?有没有考虑查询语句的效率?select语句本身如何优化?
STL容器有用过?vector结构?map有用过吗?主要总在什么场景?什么时候用vector什么时候用map?
指针与引用区别
c++和c区别
智能指针
有没有了解其它语言?
进程线程区别?
进程间通信方式?哪种方式最快?
有没有写过多进程多线程程序?
有没有用过锁?
有没有了解网络?有没有写过套接字程序?
在文件中找到特定字符串的linux命令
打印某一行数据的命令?
有没有用过git?看过github吗?
有没有接触过新技术?机器学习有了解吗?有没有学过LR?分类算法有了解吗?介绍下k_means的原理?
算法题:
一个整形数组,数据有正有负,数组中一个或多个连续数据组成子数组,每个子数组有个和,如何求和的最大值?
你的方法的时间复杂度?
有没有什么想问我的?
算法题目时剑指offer上原题
int find_len(int a[],int n)
{
int dp[n+1];
int max_va=0xFFFFFFFF; //int的最大负值
for(int i=0;i<n;i++)
{
if(i==0)
dp[i]=a[i];
else if(dp[i-1]<=0)
dp[i]=a[i];
else if(dp[i-1]>0)
dp[i]=dp[i-1]+a[i];
if(dp[i]>max_va)
max_va=dp[i];
}
return max_va;
}
动态规划的想法:以dp[i]表示以第i个数字结尾的子数组的最大和,考虑dp[i-1],如果dp[i-1]<=0,就令dp[i]=a[i],否则dp[i]=dp[i-1]+a[i];
dp[i]=a[i] i=0或dp[i-1]<=0
dp[i]=dp[i-1]+a[i] dp[i-1]>0
思路相同的非动态规划
int find_len(int a[],int n)
{
int max_va=0xFFFFFFFF; //int的最大负值
int cursum=0;
for(int i=0;i<n;i++)
{
if(cursum<=0)
cursum=a[i];
else
cursum+=a[i];
if(cursum>max_va)
max_va=cursum;
}
return max_va;
}
实验室小伙伴的题目:
自己的想法是维护一个队列,如果当前和满足条件,再看把队首元素去除看是否满足条件,以期得到最小长度。最后的队列就是所求的子数组。
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
queue<int> q;
int main()
{
int num,s;
cin>>num>>s;
int min_len=10000;
int len=0;
if(s<=0)
{
cout<<0<<endl;
}
int a[num];
int sum=0;
for(int i=0;i<num;i++)
{
cin>>a[i];
q.push(a[i]);
sum+=a[i];
len+=1;
while(q.size()>0&&sum>=s&&sum-q.front()>=s)
{
sum-=q.front();
q.pop();
len-=1;
}
if(sum>=s&&len<min_len)
{
min_len=len;
}
}
if(min_len!=10000)
{
cout<<min_len<<endl;
int size_queue=q.size();
for(int i=0;i<size_queue;i++)
{
cout<<q.front()<<endl;
q.pop();
}
}
else
cout<<0<<endl;
return 0;
}
其实想法就是一个滑动窗口,如果不要求输出子数组的话,其实就是不用搞一个队列。。。
int a[num];
int sum=0;
int start=0;
for(int i=0;i<num;i++)
{
cin>>a[i];
sum+=a[i];
while(sum>=s)
{
min_len=min(min_len,i-start+1);
sum-=a[start++];
}
}