腾讯笔试 4.18 差一点AK 各题的做法和代码

注意我是投后台开发的,所以题目不一定和其他岗位相同

先提前声明:我是条ACM铜狗,这次能差点AK很大程度上也是因为这一点。

先上做法,下一楼再上代码
T1 求最小字典序的链表 AC
暴力穷举每条链表
T2 发公告 AC
维护结构体 node 记录每个人的时间间隔、id、下一次能接收的时间。
然后自定义比较器的优先队列。优先选择下一次能接收的时间小的,其次选择编号小的。
T3 俱乐部扣积分 AC
自定义比较器,扣分越大越靠前,扣分相同时截至时间小的靠前。然后用这个比较器 sort 一遍。
sort 完后挨个尝试安放项目,如果时间点 i 已经安过项目了,那下次就往 i 之前的没被安放的时间点放。
T4 能换位的字符串比较 AC
对两个字符串分别做一种特殊的递归操作,然后比较是否相同即可。
递归操作的伪代码:

void part(char* s, int len)
{
        // 如果长度为奇数,不能再分,直接返回
    if(len&1) return;
    // 如果长度为偶数,递归分离
    char *b = s+len/2;
    part(s, len/2);
    part(b, len/2);
        // 如果后半部分比前半部分字典序更小,那就交换这俩字符串
    if(cmp(s,b,len/2)>0)
        strswap(s,b,len/2);
}

T5 打地鼠 过90%
暴力DP。
没AC的原因是最后五分钟的时候我才发现题目里还有一句:这轮从a到b,下轮就不能从b到a了。

好了,剩下的时间就是祈祷我不会因为双非本科的学历被刷掉简历了。

各题代码:

T1 AC

 struct ListNode {
    int val;    
    struct ListNode *next;
};


class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param S ListNode类 val表示权值,next指向下一个元素
     * @return ListNode类
     */
    int len;
    ListNode* head;
    int cmp(ListNode* pta, ListNode* ptb){
        ListNode* a = pta;
        ListNode* b = ptb;
        int cnt = len;
        while(cnt--){
            if(a->val!=b->val) return a->val-b->val;
            a=a->next;
            b=b->next;
            if(a==nullptr) a=head;
            if(b==nullptr) b=head;
        }
        return 0;
    }

    void getlen(ListNode* a){
        len=0;
        ListNode* x = a;
        while(x!=nullptr){
            x=x->next;
            len++;
        }
    }

    ListNode* solve(ListNode* S) {
        head = S;
        ListNode* ret = S;
        getlen(S);
        ListNode* p = ret->next;
        for(int i=1;i<len;i++, p=p->next){
            if(cmp(ret, p)>0)
                ret=p;
        }
        p = ret;
        while(len--){
            if(p->next == nullptr && len>0){
                p->next=head;
            }
            else 
            if(len==0){
                p->next = nullptr;
            }
            p=p->next;
        }
        //p->next=nullptr;
        return ret;
    }
};

T2 AC

#include <bits/stdc++.h>
using namespace std;

struct node
{
    int t;
    int id;
    int stamp;
    bool operator<(const node& other) const {
        if(other.stamp!=stamp) return other.stamp<stamp;
        else return other.id<id;
    }
};

int main()
{
    ios::sync_with_stdio(0);
    priority_queue<node> q;
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        int t;
        cin>>t;
        q.push(node{t,i,t});
    }
    while(k--){
        node x = q.top();
        q.pop();
        cout<<x.id<<"\n";
        //cout<<x.id<<" "<<x.t<<"\n";
        q.push(node{x.t,x.id,x.stamp+x.t});
    }
    return 0;
}

T3 AC

#include <bits/stdc++.h>
using namespace std;

const int MAXN=1000+5;

struct node{
    int t;
    int val;
}a[MAXN];

bool vis[MAXN];

int cmp(const node& a,const node& b){
    if(a.val!=b.val) return a.val>b.val;
    else return a.t<b.t;
}

bool putit(int id){
    while(id>=1 && vis[id]){
        id--;
    }
    vis[id]=true;
    return id!=0;
}

void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i].t;
    for(int i=1;i<=n;i++) cin>>a[i].val;
    for(int i=1;i<=n;i++) vis[i]=false;
    sort(a+1,a+n+1,cmp);
    int ans =0 ;
    for(int i=1;i<=n;i++){
        if(!putit(a[i].t)){
            //cout<<a[i].val;
            //for(int i=1;i<=n;i++)    cout<<vis[i];
            //cout<<"\n";
            ans+=a[i].val;
        }
    }
    cout<<ans<<"\n";
    // for(int i=1;i<=n;i++){
    //     cout<<a[i].t<<" "<<a[i].val<<"\n";
    // }
}

int main(){
    ios::sync_with_stdio(0);
    int T;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

T4 AC

#include <bits/stdc++.h>
using namespace std;

const int MAXN=1e5+5;
char sa[MAXN],sb[MAXN];

int cmp(char* a, char* b, int len){
    for(int i=0;i<len;i++){
        if(a[i]<b[i]) return -1;
        else if(a[i]>b[i]) return 1;
    }
    return 0;
}

void strswap(char* a, char* b, int len){
    for(int i=0;i<len;i++){
        swap(a[i],b[i]);
    }
}

void part(char* s, int len){
    // odd
    if(len&1) return;
    // even
    char *b = s+len/2;
    part(s, len/2);
    part(b, len/2);
    if(cmp(s,b,len/2)>0)
        strswap(s,b,len/2);
}

bool solve(){
    cin>>sa>>sb;
    int len = strlen(sa);
    if(cmp(sa,sb,len)==0){
        return true;
    }
    if(len&1){
        return false;
    }
    part(sa, len);
    part(sb, len);
    //cout<<"af a :"<<sa<<"\n";
    //cout<<"af b :"<<sb<<"\n";
    return cmp(sa,sb,len)==0;
}

int main(){
    ios::sync_with_stdio(0);
    int T;
    cin>>T;
    while(T--){
        cout<<(solve()?"YES\n":"NO\n");
    }
    return 0;
}

T5 过90%

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 15;
int d[MAXN][MAXN];
int f[MAXN][MAXN];
int g[MAXN][MAXN];

int main(){
    int n,m,T;
    cin>>n>>m>>T;
    memset(d,0x3f3f3f3f,sizeof(d));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>d[i][j];
        }
    }
    for(int i=0;i<=MAXN;i++){
        for(int j=0;j<=MAXN;j++){
            f[i][j]=g[i][j]=-0x3f3f3f3f;
        }
    }
    int t=1;
    f[1][1]=0;
    for(;t<=T;t++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                g[i][j]=max(max(f[i-1][j],f[i][j-1]),max(f[i+1][j],f[i][j+1]));
                if(t%d[i][j]==0){
                    g[i][j]++;
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                f[i][j]=g[i][j];
            }
        }
    }


    if(f[n][m]>0)    cout<<f[n][m];
    else cout<<0;

    return 0;
}

#腾讯##数据开发工程师##笔经#
全部评论
巨佬
2 回复 分享
发布于 2021-04-19 09:55
第一题原来可以这样 涨见识了
1 回复 分享
发布于 2021-04-19 10:00
c++ t2 t3数组暴力 for循环可过 vector过不了就离谱
点赞 回复 分享
发布于 2021-04-19 09:56
第四题有点没看懂,大佬解释一下
点赞 回复 分享
发布于 2021-04-19 11:42
大佬第五题,你现在做出来了吗?卑微小白/(ㄒoㄒ)/~~
点赞 回复 分享
发布于 2021-04-19 14:05

相关推荐

虚闻松声:很顶的简历,不改也没啥问题。 两点建议 1. 细化项目经历。关于【负责内容】可以稍微再具体一些,重点项目可以写两三个大的模块,以列表形式展开。同时适当提一下项目最终的效果。 2. 适当精炼表达。课程写一行足矣;荣誉奖项,写成一两行吧;CET-6再加一句话就行了,4 没必要写 CV、求职等咨询,欢迎私信交流。
投递中科院自动化所等公司9个岗位 > 听劝,这个简历怎么改
点赞 评论 收藏
分享
02-08 15:53
门头沟学院 Java
CoderEcho:让公司知道便宜没好货
点赞 评论 收藏
分享
双飞二本嵌入式求拷打我是在&nbsp;BOSS&nbsp;上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1.&nbsp;嵌入式开发能力:&nbsp;&nbsp;&nbsp;熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。&nbsp;&nbsp;熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。&nbsp;&nbsp;熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2.&nbsp;硬件设计能力:&nbsp;&nbsp;&nbsp;具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。&nbsp;&nbsp;&nbsp;熟悉硬件原理图分析,能够快速理解并调试硬件电路。3.&nbsp;机器人开发与竞赛经验:&nbsp;&nbsp;&nbsp;在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。&nbsp;&nbsp;&nbsp;熟悉Linux环境,对ROS和ROS&nbsp;2有一定了解,能够进行机器人系统的开发与调试。4.&nbsp;编程能力:&nbsp;&nbsp;&nbsp;熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。&nbsp;&nbsp;&nbsp;具备良好的代码规范和文档编写能力。5.&nbsp;团队协作与领导能力:&nbsp;&nbsp;&nbsp;在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。&nbsp;&nbsp;&nbsp;在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
评论
22
41
分享

创作者周榜

更多
牛客网
牛客企业服务