京东笔试 京东笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

