题解 | #找位置# C++实现

alt

分析:将字符串以字符数组的方式读入。需要记录每个字符以及他们出现的位置,考虑使用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");
            }

        }


    }


}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务