OJ地址:https://vjudge.net/problem/OpenJ_Bailian-4071
给定一个ASCII字符串,查找字符串中,出现了k次的字符。比如,字符串"This is a good day!"中,出现了2次的字符为'a','d','i','o', 's',出现了4次的字符为' '。
Input
第一行是一个正整数n(1<=n<=100),表示下面要进行查找的字符串的数量。其后n行,每行是一个字符串(这里确保字符串的结尾不是空格),和一个数字k,字符串和数字k之间由一个空格隔开。
Output
输出要求按照ASCII码从小到大的顺序输出字符,每个字符用单引号括起来,字符间用逗号隔开。
Sample Input
2
This is a good day! 2
This is a good day! 4
Sample Output
'a','d','i','o','s'
' '
程序代码:
错误:提交错误:
int main(){
int n;
scanf("%d",&n);
getchar();
char s[10010];
for(int i=0;i<n;i++){
gets(s);
int x = strlen(s);
int h=0,num=0;
int m[128]={0};
char mm[3];
for(int j=0;j<x;j++){
if(isdigit(s[j])){
h=j;
break;
}else{
m[s[j]]++;
}
}
for(int j=h;j<x;j++){
if(isdigit(s[j])){
num=num*10+(s[j]-'0');
}
}
m[32]=m[32]-1;
int flag = 0;
for(int k=0;k<128;k++){
if(m[k]==num){
if(flag==0){
printf("'%c'",k);
flag=1;
}else{
printf(",'%c'",k);
}
}
}
printf("\n");
}
return 0;
}
using namespace std;
int main(){
int n;
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++){
char s[10010];
gets(s);
int length=strlen(s);
int m[128]={0};
for(int j=0;j<length-2;j++){
if(count(s,s+length-3,s[j])==s[length-1]-'0'){
m[s[j]]=1;
}
}
int flag=0;
for(int k=0;k<128;k++){
if(m[k]){
if(flag==0){
printf("'%c'",k);
flag=1;
}else{
printf(",'%c'",k);
}
}
}
printf("\n");
}
return 0;
}
正确:
/* Bailian4071 查找出现了k次的字符 */
char s[N];
int count[N];
int main()
{
int n, k, len, i, flag;
scanf("%d", &n);
getchar();
while(n--) {
gets(s);
len = strlen(s) - 1;
while(isdigit(s[len]))
len--;
k = atoi(&s[len + 1]);
s[len] = '\0';
memset(count, 0, sizeof(count));
i = 0;
while(s[i]) {
count[(unsigned int) s[i]]++;
i++;
}
flag = 0;
for(i=1; i<N; i++) {
if(count[i] == k) {
if(flag)
printf(",");
flag = 1;
printf("'%c'", (char)i);
}
}
printf("\n");
}
return 0;
}
运行结果: