题解 | #找位置# C++实现
分析:将字符串以字符数组的方式读入。需要记录每个字符以及他们出现的位置,考虑使用multimap,因为multimap允许存在重复的键。用字符作为键,用他所在的数组下标作为对应的值,存入multimap中。只考虑出现次数大于1的那些字符,使用multimap的equal_range函数获得每个字符以及它们所有出现的位置。又因为要按照出现的次序进行统计输出,所以遍历一遍输入数组,对每种字符,在multimap中查找所有出现的位置并且输出,并且将已出现过的字符插入set中,这样就可以保证下一次该字符再次出现时,就不会再次调用multimap的equal_range进行统计了。
#include <set>
#include <map>
#include<cstdio>
#include<cstring>
using namespace std;
int main() {
char s[101] = { 0 };
scanf("%s", s);
int len = strlen(s);
multimap<char, int> um; //用允许重复插入的特性来统计字符出现次数以及每次出现的位置
set<char> m;//使用set统计字符种数
for (int i = 0; i < len; i++) {
um.insert({ s[i], i }); //记录每个字符以及每次他出现的位置
}
for (int i = 0; i < len; i++) {
if (um.count(s[i]) > 1 &&m.count(s[i]) == 0) { //只统计出现次数大于1,且未在set中的字符。(未在set时说明未统计过,则进行统计,并插入set,以后再次出现变不再统计)
m.insert(s[i]);
auto range = um.equal_range(s[i]); //从multimap中返回以某种字符为键的键值对集合
for (auto first = range.first; first != range.second; ) {
printf("%c:%d", first->first, first->second);//输出该字符出现的所有位置
if (++first !=range.second) //如果键值对集合的下一个位置还有键值对,则添加逗号,否则说明该类字符出现的位置已经统计完毕。换行
printf(",");
else
printf("\n");
}
}
}
}

