小米笔试 小米秋招 小米笔试题 1011
笔试时间:2025年10月11日
往年笔试合集:
第一题
小铭有一个长度为n的字符串s,该字符串由m种小写英文字母组成,该字符串会经过q轮迭代,每一轮迭代前会先给出字符集的排列,字符在排列中出现的位置越靠前,则表明该字符在该轮迭代中优先级更高。每一轮迭代中,优先级更高的字符会同时"消灭"右侧优先级更低的相邻字符。
你需要回答经过q轮迭代后,字符串是否只剩下一种字符。如果是,输出一行"YES",然后输出最早第几轮迭代后字符串只剩下一种字符、迭代结束后字符串的长度;否则,输出一行"NO",然后输出一行迭代结束后的字符串。
输入描述
输入包括多组测试数据。 输入第一行有一个正整数T,表示测试数据的组数。 每组测试数据的第一行有两个正整数n和m(1≤n≤10^5, 2≤m≤26),表示字符串的长度和字符集的大小; 接下来一行有一个由不重复小写英文字母组成的字符串,表示构成题目给定字符串的字符集; 接下来一行有一个由小写英文字母组成的字符串s,表示题目给定的字符串; 接下来一行有一个正整数q(1≤q≤10^5),表示迭代的轮数; 接下来q行每行有一个字符集的排列,表示每一轮迭代中各个字符的优先级。 保证每个测试点的所有测试数据的n的和不超过10^5、q的和不超过10^5,保证题目给定字符串至少由两种字符构成。
输出描述
对于每组测试数据,如果迭代结束后字符串只剩下一种字符,则输出一行"YES",然后在第二行分别输出最早第几轮迭代后字符串只剩下一种字符、迭代结束后字符串的长度;否则输出一行"NO",然后在第二行输出迭代结束后的字符串。
样例输入
2
8 6
ceilov
iloveice
2
ievolc
loveci
5 2
ab
aaabb
2
ab
ab
样例输出
NO
ioe
YES
2 3
样例说明: 对于第一组样例,第一轮迭代后字符串变成iovsie,第二轮迭代后字符串变成ioe,包含三种字符,输出一行"NO"; 对于第二组样例,第一轮迭代后字符串变成aaab,第二轮迭代后字符串变成aaa,仅剩一种字符,最早第二轮迭代后只剩下一种字符,迭代结束后字符串长度为3,输出一行"YES"、一行2和3。
参考题解
解题思路: 每轮迭代中,遍历字符串,根据给定的优先级顺序,标记需要删除的字符(优先级高的字符会消灭右侧相邻的优先级低的字符)。然后重新构建字符串,删除被标记的字符。记录是否在某轮迭代后只剩一种字符。
C++:
#include <bits/stdc++.h> using namespace std; void solve() { int n, m; cin >> n >> m; string charset; cin >> charset; string s; cin >> s; int q; cin >> q; int ans = -1; for (int r = 1; r <= q; r++) { string p_str; cin >> p_str; if (s.length() > 1) { map<char, int> mp; for (int i = 0; i < p_str.length(); i++) { mp[p_str[i]] = i; } vector<int> rm(s.length(), 0); int i = 0; while (i < s.length() - 1) { if (mp[s[i]] < mp[s[i + 1]]) { rm[i + 1] = 1; } i++; } string ns = ""; for (int i = 0; i < s.length(); i++) { if (!rm[i]) { ns += s[i]; } } s = ns; if (ans == -1) { set<char> uniqueChars(s.begin(), s.end()); if (uniqueChars.size() <= 1) { ans = r; } } } } if (ans != -1) { cout << "YES\n"; cout << ans << " " << s.length() << "\n"; } else { cout << "NO\n"; cout << s << "\n"; } } int main() { int t; cin >> t; while (t--) { solve(); } return 0; }
Java:
import java.util.*; public class Main { public static void solve(Scanner sc) { int n = sc.nextInt(); int m = sc.nextInt(); String charset = sc.next(); String s = sc.next(); int q = sc.nextInt(); int ans = -1; for (int r = 1; r <= q; r++) { String pStr = sc.next(); if (s.length() > 1) { Map<Character, Integer> mp = new HashMap<>(); for (int i = 0; i < pStr.length(); i++) { mp.put(pStr.charAt(i), i); } boolean[] rm = new boolean[s.length()]; int i = 0; while (i < s.length() - 1) { if (mp.get(s.charAt(i)) < mp.get(s.charAt(i + 1))) { rm[i + 1] = true; } i++; } StringBuilder ns = new StringBuilder(); for (int j = 0; j < s.length(); j++) { if (!rm[j]) { ns.append(s.charAt(j)); } } s = ns.toString(); if (ans == -1) { Set<Character> uniqueChars = new HashSet<>(); for (char c : s.toCharArray()) { uniqueChars.add(c); }
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南