题解 | 找位置

找位置

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

//找位置
#include<cstdio>
#include<vector>
#include<map>
using namespace std;

int main(){
    char str[200]={0};  //用于存放字符串,初始全为0
    while(scanf("%s",str)!=EOF){   //键盘输入字符串
        //1.找出所有字符的所有位置,位置信息保存在动态数组中
        // 比如字符a出现了两次,分别在下标0和3处;则map记录字符a,还有所有的位置信息(保存在数组中)
        //map用于记录字符位置
        map<char,vector<int>> timesMap; //用来记录每个字符的位置和次数(vector长度)

        //2.再用一个动态数组,记录每个字符出现的先后顺序(题目要求字符按照出现的先后顺序输出)
        vector<char> charSeq;

        //3.遍历字符数组,将位置信息放入map的值中,将字符出现的顺序放入数组charSeq中
        for(int i=0;str[i]!='\0';i++){  //遍历字符数组
            //timesMap[str[i]]:通过字符这个键,取出值,该值是一个动态数组,将位置信息i放入数组尾部存储
            timesMap[str[i]].push_back(i);
            //该字符若是第一次出现,填入charSeq中
            if(timesMap[str[i]].size()==1){ //取出字符在map中对应的动态数组,若大小为1,说明第一次出现
                charSeq.push_back(str[i]);  //将字符信息填入动态数组中
            }
        }

        //4.打印重复的字符(字符出现次数大于等于2)和位置
        vector<char>::iterator seqIt;  //迭代器
        vector<int>::iterator it;

        for(seqIt=charSeq.begin();seqIt!=charSeq.end();seqIt++){  //用迭代器遍历动态数组charSeq
            char s=*seqIt;  //取出当前迭代器指向的字符

            if(timesMap[s].size()>1){   //若该字符的数量大于1,有重复才需要打印
                it=timesMap[s].begin();
                printf("%c:%d",s,*it);  //先打印一个字符,是为了和题目输出格式匹配上
                it++;
                for(;it!=timesMap[s].end();it++){ //用迭代器遍历该字符在map里面的数组,也就是位置信息
                    printf(",%c:%d",s,*it);
                }
                printf("\n");
            }
        }
    }
    
    return 0;
}

全部评论

相关推荐

明明就不饿:看不懂你到底会啥,什么岗位
点赞 评论 收藏
分享
牛客93169152...:可以发邮件,我停了三天没收到链接,发邮件问了一下,十分钟后就有了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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