小米笔试 小米秋招 小米笔试题 1011

笔试时间:2025年10月11日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

小铭有一个长度为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 春招笔试合集 文章被收录于专栏

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

全部评论

相关推荐

威猛的香菇在秋招:感觉假的…测开怎么可能才13k
点赞 评论 收藏
分享
经历了脉脉”开盒”事件后,事情都有了着落。中国没隐私可言,也就10分钟公司就知道是谁发的了(匿名就是胡说八道),说是通过状态推断,不过这都不重要了,重要的是我达到了我的目的,得到了我想要的。直系领导其实人真的挺不错,没有谴责埋怨,而是坐下来推心置腹的和我聊,问我想要什么:1.现在就不干了,现在帮我去申请福报:2.保证以后好好干,帮忙消除事件影响,仍然可以在公司继续干个几年(这个很难其实)3.准备换个公司4.现在正常干,年底福报。讲真的,领导说出这些,顿时有些五味杂陈,还挺感动呢。下面我需要想想自己到底想要什么,后面的路该怎么走了,真的到了选择面前还有些茫然了。自打大学开始,就一直在外地,11年了,的确挺想回家了,每次放假回家都是能多晚离家就多晚离家,可能是山东人骨子里的思乡情怀(认识的外地的山东朋友多半都准备回家了,当然我不是从众心理)。回家看之前的朋友在县城其实过的也挺不错,有自己的房子车子家庭,没事时候约上几个好友喝喝酒打打牌吹吹牛逼,而且就在父母身边,爱人就在身边。也挺让人羡慕的,当然县城比不上大城市的互联网薪资。不能贪得无厌啥都要,其实我是能接受薪资落差的,也想回老家,过小日子了。但是的确回去的工作还没有着落,也还没有想好干什么,大中专老师,国企(家里没啥互联网公司,重国企),银行(应届生),体制内,现在看体制内是最好的,但是的确难度很大,但是话又说回来了现在干啥不难呢?可能是迷之自信吧,这么多年想要的东西(当然是合理的)都得到了,所以我觉得我沉下心去准备1年半载一定能上岸。比起大城市的灯红酒绿,我还是喜欢家人爱人都在身边,工作也有自己的生活,过简单纯粹的生活。好想回到家乡再回到你的身旁。爸妈也年纪也稍大了,也挺想回到离他们近点地方了,有事没事就能常回家看看。和女朋友异地半年了,也有挺多亏欠,想早点回去不用每俩周一次的见面,不用再电话视频缓解思念,不用再说”可惜你不在,要是你在就好了”等等。我想回家,我要回家,接受得了落差和失败,也相信人是不饿不死的,回家之后面包会有的,牛奶也会有的,祝福我,也祝福牛友!
在找对象的大老虎:说真的还挺有勇气的,攒够一点钱回老家也不错
面包vs爱情,怎么选?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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