我正在写一个Moore Voting算法的实现,用于在数组中查找多数元素(即出现size/2
多次的元素)。如果存在,代码应返回多数元素,否则应返回-1。现在,majorityElement(int size, int arr[])
如果我直接在main()
函数中对整数数组进行硬编码并从那里调用它,我的版本似乎可以很好地工作。
int majorityElement(int size, int arr[]) { int majorityindex = 0; int votes = 1; int index; for (index = 1; index(size/2)) return arr[majorityindex]; return -1; }
但是,如果尝试读取如下所示的输入流,则会遇到一些问题:
2 5 3 1 3 3 2 3 1 2 3
输入的第一行包含测试用例的数量。测试用例的第一行将是数组的大小,第二行将是数组的元素。
我试图从这样的main()
函数中读取输入流:
#include#include #include #define MAX 100 int majorityElement(int size, int arr[]); int main() { char buf[3]; fgets(buf, MAX, stdin); int n = atoi(buf); char a[3]; char b[MAX]; int i; int count; int* num; for (i = 0; i 我把规模
buf[]
和a[]
作为3
申报期间为他们必须有足够的空间\n
字符阅读fgets()
以及终止\0
字符。据我所知,该atoi()
函数\n
在将字符数组(字符串)转换为整数时会忽略字符。我试图将输入的第一个条目(即条目数)存储在字符数组中buf
,将其转换为字符串,然后将其存储在变量中n
。同样,我尝试获取变量中测试数组的大小以及x
整数数组中测试数组(测试用例的第二行)的大小arr
。虽然buf
并n
似乎在所有情况下获得正确的价值观,我不太肯定arr
。我知道这会fgets()
留下一个终端\n
字符,并且可能会在使用进行标记化时造成严重破坏strtok
,尽管我不知道为什么。我尝试在GeeksForGeeks上提交此代码。它为样本测试用例提供了绝对正确的输出:2 5 3 1 3 3 2 3 1 2 3那是
3 -1但是,当我尝试“提交”我的解决方案时,它说:
Possibly your code doesn't work correctly for multiple test-cases (TCs). The first test case where your code failed: Input: 4 1 2 2 1 Its Correct output is: -1 And Your Code's output is: 1我似乎无法理解这一点。如果我手动在
stdin
:1 4 1 2 2 1代码输出
-1这确实是正确的解决方案。这与提交期间声明的输出不匹配,即
1
。所以我不太确定我要去哪里。我在功能中使用fgets()
或使用strtok()
不正确main()
吗?或者是别的什么?
main()
根据注释中的建议更新了功能。int main() { char buf[MAX]; fgets(buf, MAX, stdin); int n = atoi(buf); char a[MAX]; char b[MAX]; int i; int count; int* num; for (i = 0; ix) break; arr[k] = atoi(token); token = strtok(NULL, " "); k++; } printf("%d\n", majorityElement(x, arr)); } return 1; }
正如@Vlad指出的那样,我的原始数组中的MAX设置得太低。问题是
10^7
数组中的条目数上限为10^6
(7位),每个数组条目的上限为上限。因此,MAX必须是有序的10^8
。根据评论中的建议,我现在使用动态分配而不是可变长度数组。#include#include #include #define MAX 10000000 int majorityElement(int size, int arr[]) { int majorityindex = 0; int votes = 1; int index; for (index = 1; index (size/2)) return arr[majorityindex]; return -1; } int main() { char* buf = calloc (MAX, sizeof(char)); fgets(buf, MAX, stdin); int n = atoi(buf); char* a = calloc (MAX, sizeof(char)); char* b = calloc(MAX, sizeof(char)); int i; for (i = 0; i x) break; arr[k] = atoi(token); token = strtok(NULL, " "); k++; } printf("%d\n", majorityElement(x, arr)); free(arr) } free(buf); free(a); free(b); return 1; } 如果我将MAX设置为,
10^7
那么代码将通过所有测试用例并被接受提交。但是,如果我将MAX设置为10^8
(按要求),则会出现分段错误。如何克服呢?