题目描述
对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 输出:a,1;a,4;a,5;a,10,b,2;b,11,1,8;1,12, 2,9;2,13。
输入描述:
输入包括一个由字母和数字组成的字符串,其长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据, 按照样例输出的格式将字符出现的位置标出。 1、下标从0开始。 2、相同的字母在一行表示出其出现过的位置。
示例1
输入
abcaaAB12ab12
输出
a:0,a:3,a:4,a:9 b:1,b:10 1:7,1:11 2:8,2:12
#include<stdio.h>
#include<string.h>
int main(){
char a[101];
while(scanf("%s",a)!=EOF){
int i,j,len=strlen(a);
for(i=0;i<len;i++){
int flag=0; //标志是否为第一次输出,用来控制格式
if(a[i]=='*') //第二次遇到*则跳过
continue;
for(j=i+1;j<len;j++){
if(a[i]==a[j]&&flag==0){
printf("%c:%d,%c:%d",a[i],i,a[j],j);
flag=1;
a[j]='*'; //将已经输出的置*避免重复
continue;
}
if(a[i]==a[j]){
printf(",%c:%d",a[j],j);
a[j]='*'; //将已经输出的置*避免重复
}
}
if(flag==1)
printf("\n");
}
}
return 0;
}
tips:这是一道水题,奈何自己思路不清晰,以下是自己的代码,不知道怎么来控制格式输出,而且有些 冗余,不过思路和上面是一样的,遍历输出(暴力)
这是自己之前没改的代码,有点冗余,不过能A
#include<stdio.h>
#include<string.h>
int main(){
char a[101];
while(scanf("%s",a)!=EOF){
int i,j,len=strlen(a);
int flag[101]={0}; //声明可
for(i=0;i<len;i++){
for(j=0;j<len;j++){
if(a[i]==a[j]){
flag[i]++;
}
}
}
for(i=0;i<len;i++){
int single=0;
int first=0;
for(j=0;j<len;j++){
if(flag[i]!=1&&a[j]==a[i]){
if(first==0){
printf("%c:%d",a[j],j);
first=1; //就是一个标志的问题,以前是判断最后一个,这次换衣波,判断是否为第一个
}else{
printf(",%c:%d",a[j],j);
}
single=1;
if(i!=j)
flag[j]=1;
}
}
flag[i]=1;
if(single==1)
printf("\n");
}
}
return 0;
}