我正在尝试查看数组中出现的数字最多。我写了这段代码,但它没有输出正确的数字。有人能告诉我哪里出错了吗
我的逻辑:
int frequency_number (int array[]) {
int freq_num = 0;
int i = 0;
int j = 0;
while(i < ARRAY_SIZE) {
if (array[i] == array[j]) {
freq_calcualtor = (freq_number);
}
return freq_num;
}
答案 0 :(得分:1)
你忘记设置freq_amt
,所以总是为0.每个数字看起来都比这更频繁,所以你会得到最后一个数字而不是最常用的数字..
if(loop_freq_amt > freq_amt) {
freq_num = loop_freq_num;
freq_amt = loop_freq_amt; // Added
}
答案 1 :(得分:1)
您的代码中有一些小错误。
之后,一些编码风格的建议:在循环数组时,使用带有内部迭代器声明的for循环。变量loop_fre_num是无用的。
int most_freq(int num_array[], size_t total_numbers)
{
int freq_num = 0;
int freq_amt = 0;
for (size_t i = 0; i < total_numbers; ++i) {
int loop_freq_amt = 0;
for (size_t j = 0; j < total_numbers; ++j) {
if (num_array[i] == num_array[j]) {
++loop_freq_amt;
}
}
if(loop_freq_amt > freq_amt) {
freq_num = num_array[i];
freq_amt = loop_freq_amt;
}
}
return freq_num;
}
关于“复制,排序和查找最长序列”,这是一个实现:
int qsort_comp_int(const void *elem1, const void *elem2)
{
return (*(int *)(elem1) - *(int *)(elem2));
}
int most_freq(int num_array[], size_t total_numbers)
{
int *copy = NULL;
size_t copyByteSize = sizeof(*copy) * total_numbers;
int freq_num = num_array[0];
int freq_max_amt = 0;
int freq_current_amt = 0;
copy = malloc(copyByteSize);
memcpy(copy, num_array, copyByteSize);
qsort(copy, total_numbers, sizeof(*copy), qsort_comp_int);
for (size_t i = 0; i < total_numbers; ++i) {
if (i != 0 && copy[i] != copy[i - 1]) {
if (freq_max_amt < freq_current_amt) {
freq_num = copy[i - 1];
freq_max_amt = freq_current_amt;
}
freq_current_amt = 0;
} else {
++freq_current_amt;
}
}
free(copy);
return (freq_num);
}
int main (void)
{
int array[] = {1, 2, 3, 4, 1, 1, 1, 0, 4, 10, 3};
printf("'%d'\n", most_freq(array, sizeof(array)/sizeof(*array)));
}
答案 2 :(得分:0)
您忘了更新freq_amt。
另一个解决方案是创建一个累加器(大小最大的数组),并在第一个循环中增加当前数字的累加器
在第二个循环中找到对应于更多频率数的累加器的值。