题解 | 找位置 方法二: 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,努力中。。。