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




 
  
#腾讯##笔试题目##秋招##校招# 投递中国邮政储蓄银行等公司10个岗位
投递中国邮政储蓄银行等公司10个岗位 阿里巴巴公司氛围 653人发布
阿里巴巴公司氛围 653人发布
