题解 | 找位置
找位置
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;
}
查看16道真题和解析