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

