题解 | 找位置 方法二: multimap,但还是要vector<char>记录先后顺序

找位置

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

#include <iostream>
// map不允许 关键字重复 的键值对,只会读入第一对,其它无影响
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    char input[200] = {0}; // 初始化
    // 按照key排序,会打乱  原先输入顺序,关于顺序可以用vector记录
    multimap<char, int> charAndPos;  // 题目要求可以记录重复的char
    vector<char> charOrder;  // 记录字符第一次录入先后顺序
    vector<char>::iterator findIt;
    while (cin >> input) {
        for (int i = 0; input[i] != '\0'; i++) { // 读入元素
            charAndPos.insert({input[i], i});
            // 误区: 直接调用find()函数,不是charOrder.find()
            findIt = find(charOrder.begin(), charOrder.end(), input[i]);
            if (findIt == charOrder.end()) {
                charOrder.push_back(input[i]);   // 记录字符顺序(第一次出现才记录)
            }
        }
        vector<char>::iterator charIt;
        for (charIt = charOrder.begin(); charIt != charOrder.end(); charIt++) {
            if (charAndPos.count(*charIt) > 1) {  // 重复字符才打印
                multimap<char, int>::iterator posIt;
                //charAndPos.lower_bound(*charIt)+1 这样错误,不能使用+1
                // posIt = charAndPos.lower_bound(*charIt); posIt++; 这样解决
                posIt = charAndPos.lower_bound(*charIt);
                cout << *charIt << ":" << posIt->second;
                posIt++;
                for (posIt; posIt != charAndPos.upper_bound(*charIt);
                        posIt++) {
                    cout << "," << *charIt << ":" << posIt->second;
                }
                cout << endl;
            }
        }
    }
}

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

复试ing,努力中。。。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务