京东秋招后端笔试第五场(答得不好)

选择题

记得考了:

操作系统中单处理器、多处理器互斥

数据库的共享锁和互斥锁

哈希采用线性探测时 平均搜索长度

HTTP2 和 HTTP3的区别,基于什么协议,HTTP2是不是二进制的

编程题

第一题

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();//有这么多个卡 编号是1到n
        int m=in.nextInt();//有这么多个门 每个门对应一个区间
//本质上 是要确认有没有哪个数 落在所有区间内
        int left=Integer.MIN_VALUE,right=Integer.MAX_VALUE;
        int ans=0;
        for(int i=0;i<m;i++){
            int li=in.nextInt();
            int ri=in.nextInt();
            left=Math.max(left,li);
            right=Math.min(right,ri);
            if(left>right)
                break;
        }
        if(left<=right)
            ans=right-left+1;
        System.out.println(ans);

    }
}

第二题 只通过了37.5%的用例,时间超时

调了快一小时,用例通过数都没变 懵逼中 希望有大佬能发下解答

题目

我写的代码 思路就是用回溯法找到所有情况

把问题转换成了 找到walk个不用跳的格子

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    static Set<Long> set;
    static long L;static long b;
    static Map<Long[],Boolean> quicktest;
    private static boolean test(long walk,long cur){//试探 返回true或者false
        Boolean ans=quicktest.getOrDefault(new Long[]{walk,cur},null);
        if(ans!=null)
            return ans;
        if(walk==0) {
            quicktest.put(new Long[]{walk,cur},cur <= L);
            return cur <= L;
        }
        if(walk<0)
        { quicktest.put(new Long[]{walk,cur},false);
            return false;}
        if(cur>=L)
        { quicktest.put(new Long[]{walk,cur},false);
            return false;}
        //如果跳
        cur+=b;
        boolean tmp=test(walk,cur),tmp2=false;
        if(tmp)
            return true;
        cur-=b;//撤回这个跳
        //判断这里能不能走
        if(set.contains(cur)==false){//没有障碍物 能走
            walk--;cur++;
            tmp2=test(walk,cur);
        }
        quicktest.put(new Long[]{walk,cur},tmp2);
        return tmp2;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int T= in.nextInt();//一共T组数据
        for(int i=0;i<T;i++){
            int n= in.nextInt();//一共有n个障碍
            L= in.nextLong();//起点是0 终点是L
            long m= in.nextLong();//必须恰好完成m次
            b= in.nextLong();//每次只跳这个长度
            set=new HashSet<>();
            //接下来输入n个整数
            for(int j=0;j<n;j++){
                long a=in.nextLong();//可以得到每个障碍物的位置
                set.add(a);
            }
            quicktest=new HashMap();
            //总结一下约束条件:最后恰好到达L。跳的次数恰好是m。如果从i起跳,那么会到达i+b
            //思路:一次递归 只要能恰好找到walk个 用走的格子就行
            long walk=L-m*b;
            if(walk<0){
                System.out.println("No");
                continue;
            }else if(walk==0){
                System.out.println("Yes");
                continue;
            }
            boolean ans=test(walk,0);
            //最后输出yes或者no
            if(ans){
                System.out.println("Yes");
            }else
                System.out.println("No");

        }

    }
}

第三题

题目:n,k,m,数组里任意k个数的和都小于等于m

考完刷了下大佬们的笔记。主要是用m/k和m%k来操作

这种思路觉得比较顺:非最后k个数如果比sum/k大直接减到sum/k,对最后k个数求和,将和减到sum

#京东求职进展汇总##笔试#
全部评论
我直接去做第三题了,过了86用例,第二题打表全no都25用例,哥们下次遇见第二题这种不知道在说什么的直接骗点分先看后面的
1 回复 分享
发布于 09-07 18:17 北京
第二题是我的第三题,我连题目都没看懂
点赞 回复 分享
发布于 09-07 18:44 重庆
天翼云科技有限公司
校招火热招聘中
官网直投

相关推荐

点赞 评论 收藏
分享
8 9 评论
分享
牛客网
牛客企业服务