【9.20腾讯笔试后台/综合】也太简单了吧(附个人ac做法)

先说坑点,第一题一开始交过90%,然后后面同样代码再交就100%。第三题居然卡常,真辣鸡,当然可能是做法不对。
题目都挺简单的,没有难度(如果第三题真的是我想的那样做的话)。

个人做法已补,欢迎讨论,求大佬轻喷。

题目和个人做法

第一题:

题意:已知合法的电话号码是11位的且第一位一定是8,现给定一个只含数字的字符串,问是否能删除若干个字符使得这个字符串成为一个合法的电话号码

个人做法:只用判断0到倒数第11位是否有8出现就好,有的话就把这个8前面的都删掉,8后面的删剩11位就好。

第二题:

题意:现在领导有m(m为偶数)个人,每两个人一起共同完成一个任务,完成任务的时间为两个人的时间权值之和,现在给出n行数据,每行数据有两个值x和y,代表有x个人的时间权值为y,求所有任务最快在什么时候都完成。

个人做法:按照时间权值从小到大排序,然后双指针从两边往中间扫即可。最优的方案一定是时间权值最小的人和时间权值最大的人匹配,次小的和次大的匹配,以此类推。

第三题:

题意:有n个人比赛,每个人都有一个权值,现在要将n个人分成两组,两组间的人数差<=1,问怎么分组可以使得两个组的人的权值和的差最小。

个人做法:题目有个很关键的条件就是所有人的权值和<=1e5,所以可以用类似背包的方法做。

第i个人的权值记为a[i],令dp[i][j][k]表示只考虑前i个人,用j个人是否能将权值凑成k,如果可以则dp[i][j][k]=1,否则为0,那么转移就是如果dp[i-1][j][k]为1,那么dp[i][j+1][k+a[i]]也为1,否则为0,初始条件dp[0][0][0]=1。

考虑到dp数组空间可能会超,可以使用滚动数组节省空间。楼主这里可能代码写的比较屎,一开始只过了60%,然后到90%,最后才全过。

第四题:

题意:有n个正整数,然后将下述操作进行k次,下述操作包括3步:1.选出n个数中最小的正数x(非0);2.输出x;3. 将所有>0的数减去x;

个人做法:将n个数排序,然后去重,假设去重之后的数组长度为m,则对于第i次操作(i<=m),输出a[i]-a[i-1](这里假设数组下标为1到m,且a[0]=0),如果i>m则输出0。

第五题:

题意:给出两个长度为n的数组a和b,然后求下面这个东西(语文不好用代码代替2333)(n<=200000)
int sum=0;
for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
        sum=sum^(a[i]+b[j]);
    }
}
cout<<sum<<endl;

个人做法
:这种求异或的题99%都是按位算贡献,就是判断答案在二进制下的每位是1还是0然后组合起来。然后对于第i位(即2^i),枚举数组a(设枚举的下标为j),如果a[j]的第i位为0(即(a[j]&(1<<i))==0)那么如果a[j]和某个数x相加能使得这一位变成1,会存在如下两种情况:

1.x这位为0,且a[j]和x两个数低于这位的数(即%(1<<i)之后)相加大于等于(1<<i),那么就说明这位一定可以从更低位进位变成1;
2. x这位为1,且a[j]和x两个数低于这位的数(即%(1<<i)之后)相加小于(1<<i),那么这位就不存在进位,然后a[j]+x的第i位就很自然的是1(因为x的第i位是1)。

a[j]的第i位为0是同样的道理。所以这题的做法就是先记录下b数组中第i位为0/1的时候%(1<<i)的值,然后枚举位数i,然后在枚举数组a(枚举下标为j),然后可以计算出res=(1<<i)-a[j]%(1<<i),即让a[j]在和x相加在第i位发生进位时,x%(1<<i)的最小值,然后就可以利用lower_bound算出数量,进而统计出对于每个数a[j],和b数组每个数字相加后能使得第i位是1的数量,然后求个总和,如果是奇数说明答案第i位为1,偶数说明答案第i位为0。

对b数组记录代码如下
vector<int> magic[2][35]; //第一维表示当前位为0还是1,第二维表示存的第几位
for(int i=0;i<=30;i++){
    for(int j=0;j<n;j++){    
        if((b[j]&(1<<i))==0){  //如果b[j]的第i位为0
           magic[0][i].push_back(b[j]%(1<<i));        //存的时候要存%(1<<i)的值
        }
        else{
            magic[1][i].push_back(b[j]%(1<<i));
        }
    }
    //排序是为了二分查找
    sort(magic[0][i].begin(),magic[0][i].end());
    sort(magic[1][i].begin(),magic[1][i].end());
}

别找楼主要代码了,楼主没有存笔试代码的习惯。


顺便玄学求offer一波,我一个offer都没啊呜呜呜呜呜
#腾讯##笔试题目##秋招##校招#
全部评论
最好不要说这种话
点赞 回复 分享
发布于 2019-09-20 21:47
我是自己查出原因的,n和字符串长度不一致,自己重新算n就能过。我今年笔试一直在研究出题人会犯啥错误。
点赞 回复 分享
发布于 2019-09-20 21:39
本次tencent秋招到此结束,哈哈哈哈
点赞 回复 分享
发布于 2019-09-20 22:03
算法岗题目难的多
点赞 回复 分享
发布于 2019-09-21 10:04
坑在哪儿啊
点赞 回复 分享
发布于 2019-09-20 21:46
tql
点赞 回复 分享
发布于 2019-09-20 21:36
第一题只能30,python
点赞 回复 分享
发布于 2019-09-20 21:36
求代码
点赞 回复 分享
发布于 2019-09-20 21:37
您牛皮
点赞 回复 分享
发布于 2019-09-20 21:38
大神求贴代码
点赞 回复 分享
发布于 2019-09-20 21:41
大神求代码
点赞 回复 分享
发布于 2019-09-20 21:42
啥叫卡常
点赞 回复 分享
发布于 2019-09-20 21:44
你就三道题????
点赞 回复 分享
发布于 2019-09-20 22:00
我做的5题,也太难了8
点赞 回复 分享
发布于 2019-09-20 22:01
我们做的是一套题???还是大佬竟如此strong!!
点赞 回复 分享
发布于 2019-09-20 22:02
失业了。。。彻底失业了
点赞 回复 分享
发布于 2019-09-20 22:03
第一题这提交也太谜了
点赞 回复 分享
发布于 2019-09-20 22:07
楼主2021届的杂也来 秋招, 
点赞 回复 分享
发布于 2019-09-20 22:07
做的5题,第五题是求异或的那个,只是本人没在这题遇坑就没特意点出来
点赞 回复 分享
发布于 2019-09-20 22:20
求一个第五题题解
点赞 回复 分享
发布于 2019-09-20 22:37

相关推荐

我见java多妩媚:大外包
点赞 评论 收藏
分享
冷艳的小师弟在看机会:jd测评乱点直接被挂了,哭死~
点赞 评论 收藏
分享
评论
15
86
分享
牛客网
牛客企业服务