【笔试刷题】浙商银行-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(来自编号 |
题解
这道题的关键在于找规律,而不是真的去构造这个无限长的字符串。
首先观察一下这个拼接字符串的结构特点:
位数(
):有
个数字,总共占用
个位置
位数(
):有
个数字,总共占用
个位置
位数(
):有
个数字,总共占用
个位置
位数:有
个数字,总共占用
个位置
解题步骤如下:
-
确定所在段:从
开始,计算每段的长度。如果
大于当前段的长度,就从
中减去这段长度,并进入下一段(
加
);否则说明第
位落在当前
位数的段中。
-
定位具体数字:假设第
位落在
位数的段中,那么它是这段中的第
个
位数,该数字为
。
-
找出具体位:在这个
位数中,第
位对应的是该数字的第
位。
时间复杂度为 ,因为数字位数最多也就十几位,循环次数非常少。这个复杂度对于
的数据范围是完全可以接受的。
参考代码
- 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%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力
顺丰集团工作强度 276人发布
查看2道真题和解析