如果可以的话,请参考this hackerrank挑战。
问题是在一个数组中找到唯一的整数,给定一个数组除了一个单独的整数之外只包含对。
问题出在这个测试用例上
9
4 9 95 93 57 4 57 93 9
9是数组大小,下面是数组
请参见//突出显示的代码部分------
如果我把scanf("%d", &n)
放在int arr[n]
上面,代码运行正常,但反过来会产生可怕的结果。
#include <stdio.h>
int lonely_integer(int* a, int size);
int main(){
//n is size of array, i is counter variable
int n, i, result;
// ---------------------
int arr[n];
scanf("%d", &n);
// ---------------------
printf("%d\n", n);
for(i = 0; i < n; i++){
scanf("%d", &arr[i]);
}
result = lonely_integer(arr, n);
printf("%d", result);
return 0;
}
int lonely_integer(int* a, int size){
int i;
int res = 0;
for(i = 0; i < size; i++){
res = res ^ a[i];
}
return res;
}
7条答案
按热度按时间ac1kyiln1#
问题中给出了
n
的范围,1 <= N < 100
很小,可以使用variable length array,但您在这里做错了在将
n
用作数组大小之前,需要对其进行初始化ztigrdn82#
您可能希望用途:
这样,
arr
在运行时动态分配,因此它可以是任意大小,具体取决于输入n
。您最初执行的操作(例如,通过scanf接收
n
后声明arr[n]
):scanf("%d", &n); int arr[n];
)不是一个好主意,因为它使用了Variable-Length Arrays,这是C语言的一个特性,在最新的C标准中不是强制性的。您可以看到,
arr
是在编译时创建的,通常只能使用编译时已知的常量表达式对其进行初始化,而n
(作为用户输入接收的变量)显然不是这样。可变长度数组是该语言的一个特性,它基本上允许您绕过这一规则。也就是说,它们使你能够在编译时将数组初始化为未知的长度。这在C99中已经标准化,但是在C11中被列为“可选”。你在那之后做了什么(
int arr[n]; scanf("%d", &n);
)是非常不合逻辑的,因为,你把arr
声明为一个n
整数数组 * 在 * 你收到n
的值作为用户输入之前,并且,知道它的值,它打印垃圾,因为n
最初被初始化为一个未指定的“垃圾”值,这就是你声明VLA时的大小vnzz0bqm3#
分配带有未初始化变量的数组将导致未定义的行为,编译器将抛出警告“此函数中使用的变量未初始化”
如果您在运行时获取数组的大小,那么使用@Mints97发布的动态内存分配是明智的
如果要在编译时设置数组的大小,可以定义一个宏
或在编译代码时设置宏
zi8p0yeb4#
必须先定义“n”的值,然后才能使用used.like
逮捕间[n];
在阅读'n'的值之前。所以编译器将不知道,数组中存在多少个元素'n'可能是一个垃圾value.how它应该分配给数组多少内存。
因此在使用数组定义之前,你必须读取n的值。
ltskdhd15#
你可以使用Kotlin。分组所有的项目,并得到他们的编号与eachCount方法。它将返回一个Map〈元素,整数〉。如果我们知道将只有一个唯一的元素。我们可以采取的第一个或最后一个元素的键的Map。
wkyowqbh6#
对于最多100个元素的情况,不需要动态分配数组(通过malloc或使用VLA),只需创建一个100个元素的数组即可。
那么你只需要 * 使用 * N个元素。
不过,看看你的解决方案,为什么要用数组呢?只要计算单独的整数就行了。
xzlaal3s7#