【笔试刷题】浙商银行-2025.10.27-改编真题

✅ 秋招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🌸 目前本专栏已经上线180+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

浙商银行-2025.10.27

题目一:图书馆藏书编目系统

1️⃣:按数字位数分段,计算每段的长度

2️⃣:确定目标位置所在的位数段

3️⃣:计算具体数字及其对应位

难度:中等

题目二:商品价格区间查询

1️⃣:按层序遍历构建二叉搜索树

2️⃣:利用BST性质进行剪枝优化

3️⃣:递归累加区间内节点的价值

难度:中等

1. 图书馆藏书编目系统

问题描述

小兰是一位图书管理员,她负责管理一个大型图书馆的藏书编目系统。图书馆对每本书都进行了连续编号,编号从 开始依次递增:

为了方便统计和检索,系统会将所有图书编号按顺序拼接成一个长字符串存储在数据库中:123456789101112131415...。例如,前 本书的编号拼接后为 123456789101112131415

现在 小兰在处理借阅记录时,需要根据这个拼接字符串中的某个位置,快速找出该位置上的数字是什么(位置从 开始计数)。请帮助她编写一个查询程序。

输入格式

一个正整数 ,表示需要查询的位置编号。

输出格式

一个整数,表示拼接字符串中第 位的数字。

样例输入

10
11

样例输出

1
0

数据范围

样例 解释说明
样例1 拼接字符串为 123456789101112...,第 位是 1(来自编号 的首位)
样例2 拼接字符串为 123456789101112...,第 位是 0(来自编号 的末位)

题解

这道题的关键在于找规律,而不是真的去构造这个无限长的字符串。

首先观察一下这个拼接字符串的结构特点:

  • 位数():有 个数字,总共占用 个位置
  • 位数():有 个数字,总共占用 个位置
  • 位数():有 个数字,总共占用 个位置
  • 位数:有 个数字,总共占用 个位置

解题步骤如下:

  1. 确定所在段:从 开始,计算每段的长度。如果 大于当前段的长度,就从 中减去这段长度,并进入下一段();否则说明第 位落在当前 位数的段中。

  2. 定位具体数字:假设第 位落在 位数的段中,那么它是这段中的第 位数,该数字为

  3. 找出具体位:在这个 位数中,第 位对应的是该数字的第 位。

时间复杂度为 ,因为数字位数最多也就十几位,循环次数非常少。这个复杂度对于 的数据范围是完全可以接受的。

参考代码

  • Python
import sys
input = lambda: sys.stdin.readline().strip()

n = int(input())
k = 1  # 当前数字的位数
st = 1  # k位数的起始值

# 找到n所在的位数段
while n > k * 9 * st:
    n -= k * 9 * st
    k += 1
    st *= 10

# 计算是这段中的第几个数
idx = (n - 1) // k
num = st + idx  # 具体的数字
pos = (n - 1) % k  # 在这个数字中的位置

# 转成字符串取对应位
print(str(num)[pos])
  • Cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    long long n;
    cin >> n;
    
    long long k = 1;   // 当前数字位数
    long long st = 1;  // k位数的起始值
    
    // 找到n落在哪个位数段
    while (n > k * 9 * st) {
        n -= k * 9 * st;
        k++;
        st *= 10;
    }
    
    // 计算具体是哪个数的哪一位
    long long idx = (n - 1) / k;
    long long num = st + idx;
    int pos = (n - 1) % k;
    
    // 转字符串并输出对应位
    string s = to_string(num);
    cout << s[pos] << endl;
    
    return 0;
}
  • Java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        
        long k = 1;   // 当前数字位数
        long st = 1;  // k位数的起始值
        
        // 找到n所在的位数段
        while (n > k * 9 * st) {
            n -= k * 9 * st;
            k++;
            st *= 10;
        }
        
        // 计算具体数字和位置
        long idx = (n - 1) / k;
        long num = st + idx;
        int pos = (int)((n - 1) % k);
        
        // 转字符串输出对应位
        String s = String.valueOf(num);
        System.out.println(s.charAt(pos));
        
        sc.close();
    }
}

2. 商品价格区间查询

问题描述

小毛经营着一家电商平台,平台上的商品采用二叉搜索树来管理和存储。每个商品都有一个唯一的商品编号 ,这些商品按照编号从小到大组织在二叉搜索树中(左子树的编号 父节点编号 右子树的编号)。

为了促销活动,每个商品的价格被设定为其编号的 倍。例如,编号为 的商品,其价格为 元。

现在 小毛需要统计某个编号区间内所有商品的总价格,以便制定营销策略。请你帮他实现一个高效的查询功能:给定商品编号的区间 (闭区间),计算这个区间内所有商品的价格总和。

输入格式

第一行包含一个字符串,表示按层序遍历展开的二叉搜索树。其中用空格分隔各个节点,使用 null 表示空节点。

第二行包含两个整数 ,用空格分隔,表示查询的编号区间。

输出格式

一个整数,表示区间 内所有商品的价格总和。

样例输入

1005 1002 1008 1000 1004 null 1010
1002 1008

样例输出

401900

数据范围

  • 树中节点个数
  • 节点值
样例 解释说明
样例1 区间 内的商品编号有:,对应价格分别为 ,总和为

题解

这道题本质上是二叉搜索树的区间查询问题。直接遍历所有节点会比较慢,但利用二叉搜索树的性质可以大幅优化。

核心思路:利用BST的剪枝特性

二叉搜索树有一个重要性质:对于任意节点,其左子树的所有值都小于该节点,右子树的所有值都大于该节点。利

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

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

评论
1
1
分享

创作者周榜

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