京东笔试 京东笔试题 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多种语言版本,持续更新中。