/*思路: 先找到每个字符出现的次数——>出现次数大于1时用单独的函数查找其出现的位置 1、定义一个128大小的int型数组,将字符串的每一个字符的ASC码作为下标,统计每个字符出现的次数,每出现一次对应数组元素大小加一, 2、统计完成后,再遍历原字符串,将每个字符的ASC码作为下标查看该下标对应的数组元素值是否大于1,如果大于就直接输出(定义了一个专门用来输出的函数), 3、输出完成之后将其元素值修改为0,防止遍历到后面相同的字符时又重复输出 注:增加了一个flag标志位专门用来控制逗号的输出*/ #include <iostream> #include <string> using namespace std; const int ASC = 128;//定义一个int型数组,每个字符的ASC码值作为下标,出现一次对应元素自加1 void search(char x, string str) {//打印函数 int flag = 0;//判断是否输出逗号,一次打印结束和开始不需要打印逗号 for (int i = 0; i < str.size(); i++) {//遍历字符串 if (x == str[i]) {//如果x等于字符串的数值 if (flag) cout << ',';//如果flag为1打印逗号 cout << x << ':' << i;//打印数值和对应下标 flag = 1;//令为1,下次循环继续打印逗号 } } } int main() { int list[ASC]={0};//创建数组list用来保存出现次数,显示初始化,全部设为0,如果不设为零会出问题 string str;//字符串 while (cin >> str) {//如果输入字符串进入while循环 for (int i = 0; i < str.size(); i++) {//遍历字符串,保存出现次数 list[(int)str[i]]++;//(int)str[i]:将字符类型强转为int,作为数组下标,元素自加,表示有几个字符 } for (int i = 0; i < str.size(); i++) {//再次遍历字符串,用以打印 if (list[(int)str[i]] > 1) {//如果该字符重复,打印 search(str[i], str); cout << endl;//换行 list[(int)str[i]] = 0;//打印完某字符清零次数,以防后续遍历到重复字符重复打印 } } } return 0; }