京东秋招后端笔试第五场(答得不好)
选择题
记得考了:
操作系统中单处理器、多处理器互斥
数据库的共享锁和互斥锁
哈希采用线性探测时 平均搜索长度
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
#京东求职进展汇总##笔试#
查看14道真题和解析