0917滴滴JAVA开发笔试代码(1.82/2)

第一题代码(0.82)

只过了0.82,有大佬可以帮忙看看吗
package 滴滴;

import java.math.BigInteger;
import java.util.Scanner;

public class Q1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        StringBuilder sb = new StringBuilder();
        String ans[] = new String[1];
        dfs(str,sb,0, ans);
        System.out.println(ans[0]);
    }

    public static void dfs(String str, StringBuilder sb, int idx, String[] ans) {
        if(idx>=str.length()) {
            BigInteger bigInteger = new BigInteger(sb.toString());
            if(bigInteger.mod(new BigInteger("3")).intValue()==0) {
                ans[0] = sb.toString();
            }
            return;
        }
        if(str.charAt(idx)!='?') {
            sb.append(str.charAt(idx));
            dfs(str,sb,idx+1, ans);
            sb.deleteCharAt(sb.length()-1);
        }
        else {
            for (int i = 0; i < 10 && ans[0]==null; i++) {
                if(i==0 && idx==0) continue;//不能有前导0
                //判断和前一个是否相等
                if(idx-1>=0 && (sb.charAt(idx-1)-'0')==i) {
                    continue;
                }
                //判断和后一个是否相等
                if(idx+1<str.length() && (str.charAt(idx+1)!='?') && (str.charAt(idx+1)-'0')==i) {
                    continue;
                }
                sb.append((char)('0'+i));
                dfs(str, sb, idx+1, ans);
                sb.deleteCharAt(sb.length()-1);
            }
        }
    }
}

第二题代码(ac)

package 滴滴;

import java.util.HashMap;
import java.util.Scanner;
import java.util.TreeSet;
/*
5 2 1
1 1 3 6 10
12 3 5 12 15
1 2 1 2 1
 */
public class Q2 {
    public static void main(String[] args) {
        Scanner sc =  new Scanner(System.in);
        int n = sc.nextInt();
        int p = sc.nextInt();
        int q = sc.nextInt();
        int l[] = new int[n];
        int r[] = new int[n];
        int t[] = new int[n];
        TreeSet<Integer> set = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            l[i] = sc.nextInt();
            set.add(l[i]);
        }
        for (int i = 0; i < n; i++) {
            r[i] = sc.nextInt();
            set.add(r[i]);
            set.add(r[i]+1);
        }
        for (int i = 0; i < n; i++) {
            t[i] = sc.nextInt();
        }
        int idxCnt = set.size();
        HashMap<Integer,Integer> idMap = new HashMap<>();
        int[] reverseMap = new int[idxCnt+2];
        int id = 1;
        for (Integer idx : set) {
            // System.out.println("map 映射:("+idx+"->"+id+")");
            idMap.put(idx,id);
            reverseMap[id++] = idx;
        }

        int diffP[] = new int[set.size()+2];
        int diffQ[] = new int[set.size()+2];
        int ans = 0;
        for (int i = 0; i < n; i++) {
            int idxL = idMap.get(l[i]);
            int idxR = idMap.get(r[i]);
            if(t[i]==1) {
                diffP[idxL]++;
                diffP[idxR+1]--;
            }
            else{
                diffQ[idxL]++;
                diffQ[idxR+1]--;
            }
        }/*
        System.out.print("diffP:");
        for (int i = 1; i < diffP.length; i++) {
            System.out.print(diffP[i]+"\t");
        }
        System.out.print("\ndiffQ:");
        for (int i = 1; i < diffQ.length; i++) {
            System.out.print(diffQ[i]+"\t");
        }
        System.out.println();*/
        for (int i = 1; i < diffP.length; i++) {
            diffP[i] += diffP[i-1];
            diffQ[i] += diffQ[i-1];
        }
        for (int i = 1; i < reverseMap.length-1; i++) {
            //   System.out.println("考虑当前id:"+i+"\tdiffP:"+diffP[i]+"\tdiffQ:"+diffQ[i]);
            //  System.out.println("\trealPos:"+reverseMap[i]+"\tnextPos:"+reverseMap[i+1]);
            if(diffP[i]>=p && diffQ[i]>=q) {
                ans+=(reverseMap[i+1]-reverseMap[i]);
            }
        }
/*
        System.out.print("diffP:");
        for (int i = 1; i < diffP.length; i++) {
            System.out.print(diffP[i]+"\t");
        }
        System.out.print("\ndiffQ:");
        for (int i = 1; i < diffQ.length; i++) {
            System.out.print(diffQ[i]+"\t");
        }
        System.out.println();
        System.out.println(diffP[set.size()]+"\t"+diffQ[set.size()]);*/
        System.out.println(ans);
    }
}


#23届秋招笔面经##2023一起秋招吧##滴滴笔试##滴滴##面经笔经#
全部评论
同问第一题,lz有消息了踢我一脚
点赞 回复
分享
发布于 2022-09-17 16:52 浙江
第一题的回溯要剪枝,可以返回一个bool值,表示这次回溯是否成功,比方说str的?换成1后,这次回溯成功了,那么就不用继续再换成2、3、4、。。。了,直接剪枝;(我一开始只在i==lengh处做判断,会超时,只能通过72);  第二题只过了81,思路应该是对的,但10e9的数组太大了,不太明白这个怎么处理。
点赞 回复
分享
发布于 2022-09-17 16:55 江苏
联易融
校招火热招聘中
官网直投
第二题思路大概是什么呀大佬
点赞 回复
分享
发布于 2022-09-17 16:55 黑龙江
第一题它说字符串长度大于10000我就没敢回溯
1 回复
分享
发布于 2022-09-17 17:23 四川
压缩下标能具体说一下吗,c++看不太懂JAVA代码
点赞 回复
分享
发布于 2022-09-17 17:35 广东

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务