京东笔试 京东笔试题 0928

笔试时间:2024年09月28日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目:猜数游戏

一天,小A与小B进行猜数游戏,由小A在随机选择一个整数K并给出Q个提示,小B猜数。每次给出的提示中包含两个整数M,D表示M与K的差的绝对值不超过D。现在,小B想根据小A给出的Q条提示找出满足提示的最大的K。

输入描述

第一行包含一个整数Q,表示提示的条数 (1 <= Q <= 10^5)。

随后的Q行,每行给出两个整数M和D (0 <= M, D <= 10^9)。

输出描述

输出满足提示的最大的整数K。如果没有这样的数,输出 -1。

样例输入一

3

3 3

2 5

5 3

样例输出一

6

样例输入二

3

1 1

2 2

3 3

样例输出二

2

参考题解

通过计算每对(M,D)所确定的K的范围 [M-D, M+D],找到这些范围的交集。如果存在交集,输出交集的最大值,否则输出 -1。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false); // 加速输入输出
    cin.tie(nullptr);

    int Q;
    cin >> Q;

    long long L = -1e18, U = 1e18;

    for (int i = 0; i < Q; ++i) {
        long long M, D;
        cin >> M >> D;
        L = max(L, M - D);
        U = min(U, M + D);
    }

    if (L <= U) {
        cout << U << "\n";
    } else {
        cout << -1 << "\n";
    }

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int Q = Integer.parseInt(st.nextToken());

        long L = -1000000000000000000L;
        long U = 1000000000000000000L;

        for (int i = 0; i < Q; i++) {
            st = new StringTokenizer(br.readLine());
            long M = Long.parseLong(st.nextToken());
            long D = Long.parseLong(st.nextToken());

            L = Math.max(L, M - D);
            U = Math.min(U, M + D);
        }

        if (L <= U) {
            System.out.println(U);
        } else {
            System.out.println(-1);
        }
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

import sys
sys.setrecursionlimit(100000)
input=lambda:sys.stdin.readline().strip()
from collections import *
# from itertools import permutations,combinations,accumulate
sint = lambda: int(input())
mint = lambda: map(int, input().split())
lint = lambda: list(map(int, input().split()))

def solve():
    import sys
    Q,*rest = map(int, sys.stdin.read().split())
    L=-10**18
    U=10**18
    for i in range(0,2*Q,2):
        M,D=rest[i],rest[i+1]
        L=max(L, M-D)
        U=min(U, M+D)
    print(U if L<=U else -1)
    
if __name__ == '__main__':
    #t=int(input())
    #for _ in range(t):
    #   solve()

    solve()

第二题

题目:正方体三视图

“学霸题,数正方体,头顶标数法,三层标上3,二层标上2,一层标上1,全部加起来,你学会了吗”

给定一个矩阵,矩阵中的每个数字表示这个位置上叠放的小正方体数量。小正方体边长为1。请问:题目所描述的几何体的三视图(从正面、左面和上方看的投影)各白的面积为参多少?

输入描述

第一行两个整数n和m,表示矩阵的行数和列数 (1 ≤ n, m ≤ 100)。

随后的n行,每行m个整数aij,表示该位置上叠放的小正方体数量 (0 ≤ aij ≤ 100)。

输出描述

输出三视图的面积:从正面、左面和上面看的投影面积。

样例输入

2 3

3 3 2

3 2 1

样例输出

8 6 6

参考题解

正视图:每列的最大值之和。左视图:每行的最大值之和。俯视图:非零元素的个数。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    
    vector<vector<int>> a(n, vector<int>(m));

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> a[i][j];
        }
    }

    // 计算 front(前视图)
    int front = 0;
    for (int j = 0; j < m; ++j) {
        int max_col = 0;
        for (int i = 0; i < n; ++i) {
            max_col = max(max_col, a[i][j]);
        }
        front += max_col;
    }

    // 计算 left(左视图)
    int left = 0;
    for (int i = 0; i < n; ++i) {
        left += *max_element(a[i].begin(), a[i].end());
    }

    // 计算 top(顶视图)
    int top = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (a[i][j] > 0) {
                top += 1;
            }
        }
    }

    cout << front << " " << left << " " << top << endl;

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int[][] a = new int[n][m];

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                a[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        // 计算 front(前视图)
        int front = 0;
        for (int j = 0; j < m; j++) {
            int max_col = 0;
            for (int i = 0; i < n; i++) {
                max_col = Math.max(max_col, a[i][j]);
            }
            front += max_col;
        }

        // 计算 left(左视图)
        int left = 0;
        for (int i = 0; i < n; i++) {
     

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

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