暑期实习面试之旅

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++];
        }
    }

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值