腾讯笔试 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

相关推荐

22 41 评论
分享
牛客网
牛客企业服务