【笔试刷题】招商银行-2026.03.30-改编真题
✅ 春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
招商银行-2026.03.30
1. 术语接龙计分
问题描述
招商银行的培训平台里有一个简化版“术语接龙”小游戏。
系统维护了一份单词表,并给定一个当前单词。用户之后会依次输入若干个单词。对每次输入,只有同时满足下面两个条件,才算一次合法操作:
- 该单词在给定单词表中出现过。
- 该单词的首字母等于当前单词的末字母。
如果某次输入不合法,游戏立即结束。
如果某次输入合法,则得分加 。随后系统会从单词表中选择下一个当前单词。为了保证结果唯一,规定系统总是选择所有可接龙单词中,在单词表里最先出现的那个单词。这里“可接龙”指的是:单词的首字母等于本次用户输入单词的末字母。
如果不存在这样的下一个当前单词,游戏也会立即结束。
请你输出游戏结束时的最终得分。
输入格式
第一行输入一个整数 ,表示单词表中的单词数量。
第二行输入 个单词,表示单词表中的全部单词。
第三行输入一个单词 ,表示初始当前单词。
第四行输入一个整数 ,表示用户一共输入了多少个单词。
接下来 行,每行输入一个单词,表示用户的输入顺序。
保证所有单词都只由小写英文字母组成。
输出格式
输出一个整数,表示游戏结束时的最终得分。
样例输入 1
6
ant tiger rabbit tree elephant apple
ant
3
tiger
tiger
tiger
样例输出 1
3
数据范围
- 每个单词长度至少为
- 所有输入单词的总长度不超过
| 样例 | 解释说明 |
|---|---|
| 样例1 | 第一次输入 tiger 后,系统会把当前单词更新为 rabbit。由于 rabbit 的末字母是 t,后两次继续输入 tiger 依然合法,因此总得分为 |
题解
这题本质就是一次顺序模拟,关键在于把“下一个当前单词”预处理出来。
先看每次操作需要做什么:
- 判断用户输入的单词是否在单词表中出现过。
- 判断它的首字母是否等于当前单词的末字母。
- 如果合法,分数加一。
- 再根据这个输入单词的末字母,找到单词表中最早出现的可接龙单词,作为新的当前单词。
其中第 1 步可以用哈希集合完成,做到 判断是否存在。
第 4 步也不需要每次重新扫描整张单词表。因为系统只关心“某个首字母对应的最早出现单词”,所以我们只要从左到右扫一遍单词表,记录每个首字母第一次出现时对应的单词即可。之后如果需要找首字母为 c 的下一个当前单词,直接查表即可。
这样整道题就只需要:
- 一次扫描单词表做预处理;
- 一次按顺序扫描用户输入做模拟。
时间复杂度是 ,不计字符串哈希常数时已经足够。空间复杂度是
。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
def solve():
n = int(input())
words = input().split()
current = input()
m = int(input())
# 判断用户输入的单词是否在词表中出现过。
word_set = set(words)
# 记录每个首字母最早出现的单词。
first_by_head = {}
for word in words:
head = word[0]
if head not in first_by_head:
first_by_head[head] = word
score = 0
for _ in range(m):
word = input()
if word not in word_set or word[0] != current[-1]:
break
score += 1
nxt = first_by_head.get(word[-1])
if nxt is None:
break
current = nxt
print(score)
if __name__ == "__main__":
solve()
- Cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<string> words(n);
unordered_set<string> word_set;
array<string, 26> first_by_head{};
array<bool, 26> seen{};
for (int i = 0; i < n; i++) {
cin >> words[i];
word_set.insert(words[i]);
int idx = words[i][0] - 'a';
if (!seen[idx]) {
seen[idx] = true;
first_by_head[idx] = words[i];
}
}
string current;
cin >> current;
int m;
cin >> m;
int score = 0;
for (int i = 0; i < m; i++) {
string word;
cin >> word;
if (!word_set.count(word) || word[0] != current.back()) {
break;
}
score++;
int idx = word.back() - 'a';
if (!seen[idx]) {
break;
}
current = first_by_head[idx];
}
cout << score << '\n';
return 0;
}
- Java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine().trim());
String[] words = br.readLine().trim().split("\\s+");
String current = br.readLine().trim();
int m = Integer.parseInt(br.readLine().trim());
Set<String> wordSet = new HashSet<>(Arrays.asList(words));
String[] firstByHead = new String[26];
boolean[] seen = new boolean[26];
for (String word : words) {
int idx = word.charAt(0) - 'a';
if (!seen[idx]) {
seen[idx] = true;
firstByHead[idx] = word;
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力


