【大厂真题实战】Java工程师 | 字节面试真题(一)

简介: 【大厂真题实战】Java工程师 | 字节面试真题(一)

一、ZJ25 头条校招


描述:


头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队,每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来,在选题之前,我们对题目进行了盲审,并定出了每道题的难度系统。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a,b,c,我们希望这3道题能满足下列条件:


a<=b<=c

b-a<=10

c-b<=10

所有出题人一共出了n道开放性题目。现在我们想把这n道题分布到若干场考试中(1场或多场,每道题都必须使用且只能用一次),然而由于上述条件的限制,可能有一些考试没法凑够3道题,因此出题人就需要多出一些适当难度的题目来让每场考试都达到要求,然而我们出题已经出得很累了,你能计算出我们最少还需要再出几道题吗?


输入描述:

输入的第一行包含一个整数n,表示目前已经出好的题目数量。

第二行给出每道题目的难度系数d1,d2,…,dn。

数据范围


对于30%的数据,1 ≤ n,di ≤ 5;

对于100%的数据,1 ≤ n ≤ 10^5,1 ≤ di ≤ 100。

在样例中,一种可行的方案是添加2个难度分别为20和50的题目,这样可以组合成两场考试:(20 20 23)和(35,40,50)。


输出描述:

输出只包括一行,即所求的答案。


示例1

输入: 4

20 35 23 40

输出: 2


代码示例:


import java.io.*;
import java.util.*;
public class Main {
    private static int read(StreamTokenizer st) throws IOException{
        st.nextToken();
        return (int) st.nval;
    }
    public static void main(String[] args) throws IOException{
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        //读取N
        int N = read(st);
        //读取数组
        int[] arr = new int[N];
        for(int i=0; i<N; i++){
            arr[i] = read(st);
        }
        //数组排序
        Arrays.sort(arr);
        //贪心
        int pre=-1, size=0, cnt=0;
        int idx = 0;
        while(idx<N){
            if(size==0){
                pre = arr[idx++];
                size=1;
            }else if(size==1){
                int gap=arr[idx]-pre;
                if(gap>10 && gap<=20){
                    cnt++;
                    size=0;
                    idx++;
                }else if(gap>20){
                    cnt += 2;
                    size=1;
                    pre = arr[idx++];
                }else{
                    pre = arr[idx++];
                    size = 2;
                }
            }else{
                int gap=arr[idx]-pre;
                if(gap>10){
                    cnt++;
                    pre = arr[idx++];
                    size=1;
                }else{
                    size=0;
                    idx++;
                }
            }
        }
        if(size==1){
            cnt +=2;
        }else if(size==2){
            cnt +=1;
        }
        System.out.println(cnt);
    }
}


ZJ19 万万没想到之抓捕孔连顺


描述:

我叫王大锤,是一名特工。我刚刚接到任务:在字节跳动大街进行埋伏,抓捕恐怖分子孔连顺。和我一起行动的还有另外两名特工,我提议


我们在字节跳动大街的 N 个建筑中选定 3 个埋伏地点。

为了相互照应,我们决定相距最远的两名特工间的距离不超过 D 。

我特喵是个天才! 经过精密的计算,我们从X种可行的埋伏方案中选择了一种。这个方案万无一失,颤抖吧,孔连顺!

……

万万没想到,计划还是失败了,孔连顺化妆成小龙女,混在cosplay的队伍中逃出了字节跳动大街。只怪他的伪装太成功了,就是杨过本人来了也发现不了的!


请听题:给定 N(可选作为埋伏点的建筑物数)、 D(相距最远的两名特工间的距离的最大值)以及可选建筑的坐标,计算在这次行动中,大锤的小队有多少种埋伏选择。

注意:


两个特工不能埋伏在同一地点

三个特工是等价的:即同样的位置组合( A , B , C ) 只算一种埋伏方法,不能因“特工之间互换位置”而重复使用

数据范围: 0 < n,d>= 10^6


输入描述:

第一行包含空格分隔的两个数字 N和D(1 ≤ N ≤ 1000000; 1 ≤ D ≤ 1000000)


第二行包含N个建筑物的的位置,每个位置用一个整数(取值区间为[0, 1000000])表示,从小到大排列(将字节跳动大街看做一条数轴)


输出描述:

一个数字,表示不同埋伏方案的数量。结果可能溢出,请对 99997867 取模


示例1

输入:4 3

1 2 3 4

输出:4

说明:

可选方案 (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)


示例2

输入:5 19

1 10 20 30 50

输出:1

说明:

可选方案 (1, 10, 20)


示例3

输入:2 100

1 102

输出:0

说明:

无可选方案


代码示例:


import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int d = sc.nextInt();
            int[] locations = new int[n];
            for (int i = 0; i < n; i++) {
                locations[i] = sc.nextInt();
            }
            long count = dsp(locations, n, d);
            System.out.println(count);
        }
    }
    public static long dsp(int[] locations, int n, int d) {
        int left = 0, right = 2;
        long count = 0;
        int mod = 99997867;
        while (right < n) {
            if (locations[right] - locations[left] > d) 
                left++;
            else if (right - left < 2) 
                right++;
            else {
                long num = right - left;   // 第二位和第三位之间的最远距离
                count += num * (num - 1) / 2L; // 第二位和第三位可以排列组合的数量
                right++;
            }
        }
        count %= mod;
        return count;
    }
}


目录
相关文章
|
1月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
56 15
|
3月前
|
Java 程序员
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
234 60
|
2月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
179 14
|
2月前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
78 13
|
2月前
|
机器学习/深度学习 Java PyTorch
Java工程师如何理解张量?
刚接触AI和PyTorch,理解“张量(Tensor)”是入门关键。张量可类比为Java中的多维数组,但更强大,尤其在AI领域支持GPU加速、自动求导等特性。它不仅能高效存储数据,还能进行复杂运算,是深度学习的核心数据结构。掌握张量的维度、数据类型及GPU加速特性,对学习PyTorch至关重要。
72 3
|
3月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
138 16
|
3月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
148 9
|
3月前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
118 12
|
3月前
|
缓存 架构师 Java
Maven实战进阶(01)面试官:Maven怎么解决依赖冲突?| 有几种解决方式
本文介绍了Maven的核心功能和依赖管理技巧。Maven是基于项目对象模型(POM)的构建工具,具备跨平台、标准化、自动化等特性。其三大核心功能为依赖管理、仓库管理和项目构建。依赖管理通过pom.xml文件引入第三方组件并自动下载;仓库管理涉及中央仓库、私服和本地仓库;项目构建则通过生命周期管理编译、测试、打包等流程。文章还详细讲解了依赖冲突的解决方法,包括默认规则、手工排除和版本指定等策略。
|
3月前
|
SQL Java 数据库连接
Java MyBatis 面试题
Java MyBatis相关基础面试题

热门文章

最新文章