滴滴笔试

不废话,上题目(两道题都是模拟题,模拟题就是条件很多,写起来要很仔细)
第一道题,给一个字符串,里面有许多?号,例如字符串
?12?0?9??
,然后求满足条件的最小值
条件是,1,不能有前导0,2.?号代表的数不能和左右相邻的数相同,3.这个数要可以被三整除,以上面这个为例,最小的数是212101902
代码:
import java.util.*;

public class Main{
    public static void main(String[] args) {

        Scanner in= new Scanner(System.in);

        int num=0;
        int sum=0;

        String str=in.next();
        char[] ch=str.toCharArray();
        int n=ch.length;
        int[] arr=new int[n];
        for(int i=0;i<n;i++){
            if(ch[i]=='?'){
                arr[i]=-1;
                num++;
            }
            else {
                arr[i]=ch[i]-48;
                sum+=arr[i];
            }
        }

        for(int i=0;i<n;i++){
            if(arr[i]!=-1)continue;
            for(int j=0;j<=9;j++){
                if(i == 0){
                    if(num==1){
                        if(j!=0 && j!= arr[i+1]){
                            if((j+sum)%3==0){  arr[i]=j;
                                                        break; }                
                        }
                    }else{
                        if(j!=0 && j!= arr[i+1]){
                            arr[i]=j;
                            num--;
                            sum+=j;
                            break;
                        }
                    }
                }

                if(i!=0){
                    if(num==1){
                        if(i!=n-1){
                            if(j != arr[i+1] && j != arr[i-1]){
                                if((j+sum)%3==0)arr[i]=j;
                                break;
                            }
                        }else{
                            if(j != arr[i-1]){
                                if((j+sum)%3==0){
                                    arr[i]=j;
                                    break;
                                }

                            }
                        }
                    }else{
                        if(j != arr[i+1] && j != arr[i-1]){
                            arr[i]=j;
                            num--;
                            sum+=j;
                            break;
                        }
                    }
                }
            }
        }

        for(int i=0;i<n;i++){
            System.out.print(arr[i]);
        }
    }
}
第二道题
小明正在刷栅栏。为了使得栅栏在经过风吹雨打后依然不掉色,需要用两种不同的油漆刷栅栏。

栅栏被按顺序编号为11000000000。每一段栅栏需要至少刷 p 遍的1号油漆和 q 遍的2号油漆后才能保证长时间不掉色。

每次刷漆都会使用某种类型的油漆,并将编号属于某个区间内的栅栏都刷上这种油漆。

现在给出每次刷漆的栅栏编号范围和油漆种类,请你求出有多少段栅栏能够长时间不掉色。 * 输入描述
第一行有三个正整数n,p,q(1<=n<=100000,1<=p,q<=n),代表刷漆的次数,以及两个参数 p q。

第二到四行给出了一个大小为3*n的矩阵,第 i 列的三个数从上到下记为l,r,t(1<=l,r<=1000000000,1<=t<=2)* 代表第i次刷漆将编号在 l r 之间的栅栏刷了一遍 t号油漆。 * 输入示例  5 2 2  1 1 2 3 2 3 5 4 5 4 1 2 1 1 2  * 输出示例 * 3 
代码:
import java.util.*;

public class Main{
    public static void main(String[] args) {

        Scanner in= new Scanner(System.in);
        int res=0;

        int n=in.nextInt();
        int p=in.nextInt();
        int q=in.nextInt();

        int max=0;

        int [][] t=new int[3][n];
        for(int i=0;i<3;i++){
            for(int j=0;j<n;j++){
                t[i][j]=in.nextInt();
                max=Math.max(t[i][j],max);
            }
        }

        //System.out.println(max);

        int[][] arr= new int[max+1][2];

        //System.out.println(Arrays.deepToString(t));

        for(int i=0;i<n;i++){
            for(int j=t[0][i];j<=t[1][i];j++){
                int temp=t[2][i];
                arr[j][temp-1]++;
            }
        }

        for(int i=0;i<=max;i++){
            if(arr[i][0]>=p && arr[i][1]>=q)res++;
        }

        System.out.println(res);
    }
}
只通过了82%,不知道为啥

#滴滴笔试##笔试#
全部评论
无疑故意找茬,只是本地测试想知道自己的代码哪里错的时候,发现的。第一题代码可能存在错误。
点赞 回复 分享
发布于 2022-09-17 20:52 浙江
前缀和与差分
点赞 回复 分享
发布于 2022-09-17 17:24 广东
第二题暴力肯定T啊,要离散化然后差分
点赞 回复 分享
发布于 2022-09-17 18:29 广东
投恒生了吗? Hello,我是恒生电子股份有限公司的校园大使,不想简历投递后“泡池子”, 登录链接:campus.hundsun.com/campus/jobs 填写我的推荐码:EVKGKJ 投递,简历第一时间送到HR面前,可查进度,快来投递吧~
点赞 回复 分享
发布于 2022-09-17 22:36 江西
这样会爆内存吧,如果r到10亿,那不爆内存? 我直接创了两个10亿的数组,内存爆了。算了一下,这样要3.7G内存,我日。
点赞 回复 分享
发布于 2022-09-17 22:39 福建
老哥其实您第一题的思路也就是一路找最小的,在最后一个num的地方,把他调成可以整除3,我也是这个思路,先找到一个最小的(不考虑3).然后找到最后一个?的地方,调成能整除3,只过了45%
点赞 回复 分享
发布于 2022-09-18 05:59 美国
第一题可以在前面加个前导0,作为哨兵,这样可以减少很多判断第一位的条件
1 回复 分享
发布于 2022-09-18 02:10 四川
python第二题一样思路 超时。。
点赞 回复 分享
发布于 2022-09-17 17:35 上海
第二题一样的思路,不知道为什么只过35
点赞 回复 分享
发布于 2022-09-17 18:07 湖北
第二题一样只过了18%把n当成栅栏范围了草
点赞 回复 分享
发布于 2022-09-17 18:20 北京
第一题就过了63 不知道为什么
点赞 回复 分享
发布于 2022-09-17 18:42 重庆
第一题代码有个小失误,大家要测试的话,第49行的if条件加个大括号
点赞 回复 分享
发布于 2022-09-17 22:22 陕西
第二题一样的思路我怎么只能过73,第二题这个思路是超时了,n有点大
点赞 回复 分享
发布于 2022-09-17 23:05 四川
兄弟,看我主页进群,从此秋招不迷路
点赞 回复 分享
发布于 2022-09-18 14:08 澳大利亚
m
点赞 回复 分享
发布于 2023-03-10 15:57 湖南

相关推荐

评论
5
11
分享
牛客网
牛客企业服务