中国银行笔试 中国银行笔试题 0417
笔试时间:2025年04月17日
历史笔试传送门:
第一题
题目:输出位数
小红有一个正整数x,当x小于等于5*10^4时,需要算出的x个位数,大于5*10^4时算出的十位数,你需要书写一个程序,计算出来。
输入描述
输入的正整数。
补充说明注:该题为核心模式,不需要自己处理输入输出,代码中的类名、方法名、参数名已经指定,请勿修改,直接书写函数返回方法规定的值即可。
样例输入
12
样例输出
2
参考题解
输出个位数就是x%10,十位数就是(x/10)%10。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <bits/stdc++.h>
using namespace std;
// Equivalent of Java's Solution.processNumber
int processNumber(int num) {
if (num < 50000) {
return num % 10;
} else {
return (num / 10) % 10;
}
}
int main() {
int num;
cin >> num;
cout << processNumber(num) << "\n";
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
public class Solution {
public static int processNumber(int num) {
if (num < 50000) {
return num % 10;
} else {
return (num / 10) % 10;
}
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
# Equivalent of Java's Solution.processNumber
def process_number(num: int) -> int:
if num < 50000:
return num % 10
else:
return (num // 10) % 10
if __name__ == "__main__":
num = int(input().strip())
print(process_number(num))
第二题
题目:圆周率
小红对圆周率的数字很感兴趣,她想知道一个字符串经过重新排序后能否形成的字符串。 请编写一个程序,进行判断。
补充说明注:该题为核心模式,不需要自己处理输入输出,代码中的类名、方法名、参数名已经指定,请勿修改,直接书写函数返回方法规定的值即可。
样例输入
31415
样例输出
true
参考题解
把字符串转成数组后排序,判断两数组是否相等即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <bits/stdc++.h>
using namespace std;
bool solution(const string &s) {
string now = s;
string need = "31415";
sort(now.begin(), now.end());
sort(need.begin(), need.end());
return now == need;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
if (!(cin >> s)) return 0;
cout << (solution(s) ? "true" : "false") << "\n";
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*;
public class Solution {
public static boolean solution(String s) {
String t = "31415";
char[] now = s.toCharArray();
char[] need = t.toCharArray();
Arrays.sort(now);
Arrays.sort(need);
return Arrays.equals(now, need);
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
# Python 3
def solution(s: str) -> bool:
now = sorted(s)
need = sorted("31415")
return now == need
if __name__ == "__main__":
s = input().strip()
# print lowercase true/false to match Java's boolean toString
print(str(solution(s)).lower())
第三题
题目:数位倒置
在 n 行 m 列的网格中,我们使用\((i,j)\)表示网格中从上往下数第i行和从左往右数第j列的单元格,使用\(a_{i,j}\)表示单元格\((i,j)\)的权值,保证权值为非负整数。小红要选择一整行、一整列一共\(n + m - 1\)个单元格,并且希望选中的这些单元格的权值之和是全部选择方案中最大的。然而,小紫会在小红操作前提前选择一行元素,随后,将这一行的这m个元素全部进行数位倒置操作。小红会在小紫操作过后的网格上进行操作。你需要书写一个程序,计算小红可以得到的理论最大值。对于一个非负整数x,将其全部数位从高位到低位重新书写一遍,称为数位倒置。例如 123 进行数位倒置后得到 321,100 进行数位倒置后得到 1,9 进行数位倒置后得到 9。补充说明函数的第一个参数输入一个长度为\(n(1 \leq n \leq 100)\)、宽度为\(m(1 \leq m \leq 100)\)的二维数组a代表网格中每个单元格的权值。保证\((i,j)\)的权值\(a_{i,j}\)满足\((0 \leq a_{i,j} \leq 10^6)\)。注:该题为核心模式,不需要自己处理输入输出,代码中的类名、方法名、参数名已经指定,请勿修改,直接书写函数返回方法规定的值即可。
样例输入
[[1,2,3],[4,5,6],[7,8,9]]
样例输出
33
说明:在这个样例中,由于全部数字均只有个位,所以小紫进行任何操作均不会改变每一个单元格中的权值。
而小红的最优选择是选择第3行和第3列(下标从1开始),权值之和为3+6+7+8+9=33。
参考题解
模拟即可。不妨预处理出每行每列原本的和,之和枚举要修改的那行,暴力计算出修改之后每行每列和的变化,之和枚举选择的行和列是谁,更新最大值即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <bits/stdc++.h>
using namespace std;
int reverseInt(int num) {
string s = to_string(num);
reverse(s.begin(), s.end());
return stoi(s);
}
int work(const vector<vector<int>>& a) {
int n = a.size();
int m = a[0].size();
vector<long long> pre_rs(n, 0), pre_cs(m, 0);
// row sums
for (int i = 0; i < n; ++i) {
long long s = 0;
for (int j = 0; j < m; ++j) {
s += a[i][j];
}
pre_rs[i] = s;
}
// column sums
for (int j = 0; j < m; ++j) {
long long s = 0;
for (int i = 0; i < n; ++i) {
s += a[i][j];
}
pre_cs[j] = s;
}
long long res = 0;
// try replacing each cell's row with reversed digits row
for (int i = 0; i < n; ++i) {
vector<int> tmp(m);
for (int j = 0; j < m; ++j) {
tmp[j] = reverseInt(a[i][j]);
}
// new row sum for row i
long long new_row_sum = accumulate(tmp.begin(), tmp.end(), 0LL);
// updated column sums when row i is replaced
vector<long long> now_cs(m);
for (int j = 0; j < m; ++j) {
now_cs[j] = pre_cs[j] - a[i][j] + tmp[j];
}
// evaluate max over all cells
for (int r = 0; r < n; ++r) {
long long row_sum = (r == i ? new_row_sum : pre_rs[r]);
for (int c = 0; c < m; ++c) {
long long val = (r == i ? tmp[c] : a[r][c]);
long long col_sum = now_cs[c];
res = max(res, row_sum + col_sum - val);
}
}
}
return (int)res;
}
// Example usage
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> grid(n, vector<int>(m));
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
cin >> grid[i][j];
co
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南
查看11道真题和解析
顺丰集团工作强度 289人发布