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'
' '

程序代码:

错误:提交错误:

OpenJ_Bailian - 4071  查找出现了k次的字符_字符串

#include<cstdio>
#include<cstring>
#include<cctype>
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;
}
#include<cstdio>
#include<algorithm>
#include<cstring>
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次的字符 */

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

#define N 256
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;
}

运行结果:

OpenJ_Bailian - 4071  查找出现了k次的字符_i++_02