中国银行笔试 中国银行笔试题 0417

笔试时间:2025年04月17日

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目:输出位数

小红有一个正整数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 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论
插眼
点赞 回复 分享
发布于 06-16 09:29 上海

相关推荐

评论
1
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务