滴滴笔试 21年3月20日

没想到选择题 一个三分占60分 编程两道才 40分

选择

感觉选择好多不会啊
有java基础
操作系统线程相关
然后有Linux命令选择
别的记不太清了

编程

第一题 A了

把 26个字母 从后往前 第一次出现的顺序 记住
然后 把第一个 不是a 的换成 他前面的字母
反正就是这个意思 一下就过了

#include<iostream>
using namespace std;
int num[300];
int main(){
    string s;
    cin>>s;
    for(int i= s.size()-1;i>=0;i--){
        if(num[s[i]]==0)num[s[i]]=i;
    }
//    for(int i='a';i<='z';i++){
//        cout<<num[i]<<" "<<i<<endl;
//    }
    int flag=0;
    for(int i=0;i<s.size();i++){
        if(flag==1){
            break;
        }
        if(s[i]=='a')continue;
        else{
            for(int j='a';j<s[i];j++){

                if(num[j]>i){
                //cout<<num[j]<<": "<<i<<endl;
                    flag=1;
                    s[num[j]]=s[i];
                    s[i]=j;
                    cout<<s<<endl;
                    return 0;
                }
            }
        }
    }
    cout<<s;
    return 0;
}

第二题 过了63%

我觉得是连通图的题但是我不会
我对并查集有点印象 就用并查集暴力做的
过了百分之27 然后优化了许多 vector 之类的内存和 findfather 调用的次数(因为我忘了并查集是啥了 所以写的 不优雅)
最后显示 超时超限 过了百分之63

我发现全部输出NO 能拿百分之9

#include<iostream>
#include<vector>
#include<set>
using namespace std;
int vv[1005];
int path[100005][2];
int findfa(int a){
    if(a!=vv[a]){
        vv[a]=findfa(vv[a]);
    }return vv[a];
}
int main(){
    int t;
    cin>>t;
    for(int i=0;i<t;i++){
        int n,m;
        cin>>n>>m;
        //vector<vector<int> >node(n,vector<int>(n));
        //vector<vector<int> >path(m,vector<int>(2));
        //set<int>st;
        int flag=1;
        for(int i=0;i<m;i++){
            int a,b;
            cin>>a>>b;
            //node[a-1][b-1]=1;
            //node[b-1][a-1]=1;
            path[i][0]=a-1;
            path[i][1]=b-1;
        }
        for(int i=0;i<m;i++){
            int a,b;
            //vector<int>vv(n,999);
            for(int j=0;j<n;j++){
                vv[j]=j;
            }
            for(int j=0;j<m;j++){
                if(flag==0){
                    break;
                }
                if(j==i){
                    continue;
                }
                a=path[j][0];
                b=path[j][1];
                int fa = findfa(a);
                int fb = findfa(b);
                if(fa<fb){
                    vv[fb]=fa;
                    //findfa(fb,vv);
                }else {
                    vv[fa]=fb;
                    //findfa(fa,vv);
                }
                //cout<<a<<vv[a]<<" "<<b<<vv[b]<<endl; 

            }
            for(int i=0;i<n;i++){
                //cout<<findfa(i,vv)<<"  "<<i<<endl;
                if(findfa(i)!=0){
                    flag=0;
                }
            }
        }
        if(flag==0){
            cout<<"No"<<endl;
        }else{
            cout<<"Yes"<<endl;
        }

    }
    return 0;
}
#笔经##滴滴##Java#
全部评论
我醉了 没人第二题是那个回文串的吗 挺简单的一题直接动态规划,死活18 过了测试用例,不知道错在哪里
3
送花
回复
分享
发布于 2021-03-20 20:50
第一题这样也行的么
2
送花
回复
分享
发布于 2021-03-20 20:52
秋招专场
校招火热招聘中
官网直投
第二题全yes有82%😅 样例有点坑
1
送花
回复
分享
发布于 2021-03-20 20:50
第一题,万一输入的字符串没有a呢?
1
送花
回复
分享
发布于 2021-03-20 21:01
第二题不是判断每个节点的连接数大于等于2不就行了吗   public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int n = sc.nextInt();         for (int i = 0; i < n; i++) {             int m1 = sc.nextInt();             int m2 = sc.nextInt();             int [] num = new int[m1];             int j = 0;             while(j < m2){                 int temp1 = sc.nextInt() - 1;                 int temp2 = sc.nextInt() - 1;                 num[temp1] ++;                 num[temp2] ++;                 j++;             }             System.out.println(hasArrived(num)?"Yes":"No");         }     }     static boolean hasArrived(int[] num){         for (int i :num) {             if(i < 2){                 return false;             }         }         return true;     }
1
送花
回复
分享
发布于 2021-03-20 21:04
第二题超简单,只要判断所有点是否都有大于1个边就好了
1
送花
回复
分享
发布于 2021-03-20 21:05
第二题只要每个节点的度大于等于2即可,因为度小于等于1的时候去掉一条边就可能导致连通分量+1
1
送花
回复
分享
发布于 2021-03-20 21:13
第一题没看懂哇
点赞
送花
回复
分享
发布于 2021-03-20 23:30

相关推荐

3 14 评论
分享
牛客网
牛客企业服务