题解 | 找位置 两个map,一个记录字符位置,一个记录出现先后顺序

找位置

https://www.nowcoder.com/practice/e3b2cc44aa9b4851bdca89dd79c53150

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    char str[200] = { 0 };  // 字符串
    //记录每个字符的位置 一对多
    // !!! 相同字符,可以按照先后顺序往 动态数组 存入位置,即一个字符,对应多个位置
    // 如 字符a 动态数组中 2 表示位置为2
    map<char, vector<int>> timesMap;
    vector<char> charSeq;  // 记录每个字符出现的先后顺序
    cin >> str;
    // 字符串结束符 '\0'
    for (int i = 0; str[i] != '\0'; i++) {
        //timesMap[str[i]]得到value,即vector<int>数组
        timesMap[str[i]].push_back(
            i);  // 把某个字符的位置记录到动态数组中
        // 如果是第一次出现
        if (timesMap[str[i]].size() == 1) {
            charSeq.push_back(str[i]);  // 记录输入的先后顺序(不会有重复)
        }
    }
    // 按先后打印重复字符timesMap[str[i]].size()>=2
    vector<char>::iterator seqIt;
    for (seqIt = charSeq.begin(); seqIt != charSeq.end(); seqIt++) {
        if (timesMap[*seqIt].size() >= 2) {
            vector<int>::iterator it;
            it = timesMap[*seqIt].begin();
            cout << *seqIt << ":" << *it;  // 为了格式单独打印
            // 单独打印了一个,下面加1开始
            for (it = timesMap[*seqIt].begin() + 1; it != timesMap[*seqIt].end(); it++) {
                cout << "," << *seqIt << ":" << *it;
            }
            cout << endl;  // 重复才打印
        }
    }
    return 0;
}

#考研##复试练习##笔试#
2025考研复试 文章被收录于专栏

复试ing,努力中。。。

全部评论

相关推荐

04-17 10:16
门头沟学院 Java
不河狸啊:为什么我的是已送达,连已读都没有
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务