问题:给定n个整数的未排序数组,其中可以包含1到n的整数。某些元素可以重复多次,而数组中可以不包含其他元素。计算存在的所有元素的频率并打印缺少的元素
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
int i, j, x, t, n, m;
scanf("%d", &t);
while (t--) {
scanf("%d",&m);
int b[m];
int a[m];
int c[m];
for(i = 0; i < m; i++) {
scanf("%d", &a[i]);
}
for (i = 0; i < m; i++) {
b[i] = i + 1;
}
// for (i = 0; i < m; i++)
//{
// printf("%d ", b[i]);
//}
for (i = 0; i < m; i++) {
c[i] = 0;
}
for (i = 0; i < m; i++) {
for (j = 0; j < m; j++) {
if (b[j] == a[i]) {
c[i] = c[i] + 1;
}
}
}
for (i = 0; i < m; i++) {
printf("%d ", c[i]);
}
}
}
问题:我的输出为1 1 1 1 1.有人可以指出我的代码中的逻辑错误吗?
答案 0 :(得分:0)
问题是您使用i
而不是j
来设置可见电话号码。
for (i = 0; i < m; i++) {
for (j = 0; j < m; j++) {
if (want[j] == input[i]) {
seen[i] = seen[i] + 1; // HERE
}
}
}
如果输入2 2 2
,则i
为0时将匹配。然后,i
为1时将匹配。而i
为2时将匹配。因此,您在每个位置得到1。 i
是看到的数字的位置。相反,您想增加j
(正在检查的数字-1)。
for (i = 0; i < m; i++) {
for (j = 0; j < m; j++) {
if (want[j] == input[i]) {
seen[j] = seen[j] + 1;
}
}
}
其中指出了一种使整个过程更加有效的方法。 want
是不必要的。因为我们希望数字从1到n,所以我们可以使用seen
的数组索引+ 1。而且您不需要每次都重新扫描整个阵列,seen
可以在您阅读时建立起来。
#include <stdio.h>
#include <string.h>
int main() {
int size;
scanf("%d",&size);
int seen[size];
int input;
// Initialize seen
for(int i = 0; i < size; i++) {
seen[i] = 0;
}
// Read input and store how many integers we've seen
for(int i = 0; i < size; i++) {
scanf("%d", &input);
seen[input-1] += 1;
}
// Print the counts
for (int i = 0; i < size; i++) {
printf("%d: %d ", i+1, seen[i]);
}
puts("");
}