c -查找数组和所有具有该频率的元素的最高频率



我被要求从元素数组和所有具有该频率的元素中找到最高频率。我的代码似乎工作得很好,但它似乎有一个错误的地方,当我提交它。有人能帮我找出错误吗?

格式输入:第一行包含一个整数T,表示测试用例的数量。对于每个测试用例,第一行包含单个整数N,表示数组中元素的数量。

格式输出:由T行组成,其中每行的格式为"Case #X: Y",其中X是从1开始的测试用例编号,Y是最高频率。下一行包含所有具有该频率的元素,按升序排序。

约束条件包括:样本输入:

3
8
1 1 2 2 3 4 5 5
8
5 5 4 3 2 2 1 1 
4
1 1 1 3

样本输出:

Case #1: 2
1 2 5
Case #2: 2
1 2 5
Case #3: 3
1
下面是我的代码:
#include <stdio.h>
int main() {
int T, N[20];
scanf("%d", &T); getchar();

int A[T][20000];



for (int i = 0; i<T; i++) {
scanf("%d", &N[i]); getchar();
for (int j = 0; j<N[i]; j++) {
scanf("%d", &A[i][j]); getchar();
}

int X = 0;

for (int j = 0; j<N[i]; j++) {
for (int k = j + 1; k<N[i]; k++) {
if (A[i][k]<A[i][j]) {
X = A[i][j];
A[i][j] = A[i][k];
A[i][k] = X;
}
}
}
}

int f[20000];

for (int i = 0; i<T; i++) {
int c = 0, mc = 0;

for (int j = 0; j<N[i]; j++) {
c = 1;
if(A[i][j] != -1) {
for (int k = j+1; k<N[i]; k++) {
if (A[i][j] == A[i][k]) {
c++;
A[i][k] = -1;

}   
}

f[j]=c;
}   
if (c>mc) {
mc = c;
}
}
printf("Case #%d: %dn", i+1, mc);

for (int j = 0; j<N[i]; j++) {
if (A[i][j] != -1) {
if (f[j] == mc) {
printf ("%d", A[i][j]);
if (j<N[i]-1) {
printf(" ");
}
}

}

}

printf("n");

}

return 0;
}

编辑所以我编写了另一段代码,它不是一次输入所有数组并一次输出所有内容,而是在我输入第一个数字数组后输出频率和元素。但似乎代码仍然有问题,我找不到…注:我是新手,所以我为我的代码缺乏效率而道歉。

新代码

#include <stdio.h>
int main() {
int T, N;
scanf("%d", &T); getchar();

int A[20000];

for (int i = 0; i<T; i++) {
scanf("%d", &N); getchar();
for (int j = 0; j<N; j++) {
scanf("%d", &A[j]); getchar();
}

int X;

for (int j = 0; j<N; j++) {
for (int k = j + 1; k<N; k++) {
if (A[k]<A[j]) {
X = A[j];
A[j] = A[k];
A[k] = X;
}
}
}

int f[N], c = 0, mc = 0;

for (int j = 0; j<N; j++) {
c = 1;
if(A[j] != -1) {
for (int k = j+1; k<N; k++) {
if (A[j] == A[k]) {
c++;
A[k] = -1;
}   
}
f[j]=c;
if (c>mc) {
mc = c;
}
}   
}
printf("Case #%d: %dn", i+1, mc);

for (int j = 0; j<N; j++) {
if (A[j] != -1) {
if (f[j] == mc) {
printf ("%d", A[j]);
if (j<N-1) {
printf(" ");
}
}   
}   
}
printf("n");
}

return 0;
}

我花了几天的时间,但我终于知道如何做到这一点。显然,事情没有我想的那么复杂……下面是工作代码。谢谢大家的帮助:)

#include <stdio.h>
int main() {
int T, N;

scanf("%d", &T);

for (int i = 0; i<T; i++) {

scanf("%d", &N); getchar();

//INPUT elements and counting frequncy for each element
int f[200001] = {0}, E = 0;
for (int j = 0; j<N; j++) {
scanf("%d", &E); getchar();
f[E]++;
}

//find max frequency and how many elements with max frequency
int max = 0, c = 0;
for (int j = 1; j<200001; j++) {

if (f[j] == max) {
c ++;
}

if (f[j]>max) {
max = f[j];
c = 1;
}

}

//OUTPUT result
printf("Case #%d: %dn", i+1, max);
int counter = 0;
for (int j = 1; j<200001; j++) {
if (f[j] == max) {

counter ++;
if (counter<c){
printf("%d ", j);   
} else {
printf("%dn", j);
}

} 
}
}
return 0;
}

最新更新