C语言 查找数组中唯一的整数

8cdiaqws  于 2023-02-03  发布在  其他
关注(0)|答案(7)|浏览(159)

如果可以的话,请参考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;
}
ac1kyiln

ac1kyiln1#

问题中给出了n的范围,1 <= N < 100很小,可以使用variable length array,但您在这里做错了

int arr[n];   // n is uninitialized. Its value is indeterminate.
scanf("%d", &n);

在将n用作数组大小之前,需要对其进行初始化

scanf("%d", &n);
int arr[n];
ztigrdn8

ztigrdn82#

您可能希望用途:

#include <stdlib.h>
/* ... */
int *arr;
scanf("%d", &n);
arr = malloc(sizeof(int) * n);

这样,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时的大小

int arr[n]; //n is garbage at this point, you have no idea how large arr will be!
scanf("%d", &n); //you got the value of n that you needed, but too late, alas!
vnzz0bqm

vnzz0bqm3#

分配带有未初始化变量的数组将导致未定义的行为,编译器将抛出警告“此函数中使用的变量未初始化”
如果您在运行时获取数组的大小,那么使用@Mints97发布的动态内存分配是明智的

int data_size;
int *data_array;
scanf("%d", &data_size);
data_array = (int*)calloc(data_size,sizeof(int));
/*
 .
*/
// Free the memory at the end
free(data_array);
data_array = NULL;

如果要在编译时设置数组的大小,可以定义一个宏

#define DATA_SIZE 9

或在编译代码时设置宏

gcc test.c -o test -DDATA_SIZE=9 -Wall
zi8p0yeb

zi8p0yeb4#

必须先定义“n”的值,然后才能使用used.like
逮捕间[n];
在阅读'n'的值之前。所以编译器将不知道,数组中存在多少个元素'n'可能是一个垃圾value.how它应该分配给数组多少内存。
因此在使用数组定义之前,你必须读取n的值。

ltskdhd1

ltskdhd15#

你可以使用Kotlin。分组所有的项目,并得到他们的编号与eachCount方法。它将返回一个Map〈元素,整数〉。如果我们知道将只有一个唯一的元素。我们可以采取的第一个或最后一个元素的键的Map。

fun lonelyinteger(a: Array<Int>): Int {
        return a.groupingBy { it }.eachCount().filter { it.value==1 }.keys.first()
    }
wkyowqbh

wkyowqbh6#

对于最多100个元素的情况,不需要动态分配数组(通过malloc或使用VLA),只需创建一个100个元素的数组即可。
那么你只需要 * 使用 * N个元素。

int arr[100];  // input will be 1..100 elements

  int size;
  scanf( "%d", &size );  // input is in 1..99

  for (int i = 0;  i < size;  i++)
    scanf( "%d", &arr[i] );

不过,看看你的解决方案,为什么要用数组呢?只要计算单独的整数就行了。

#include <stdio.h>

int get_int(void)
{
  int d;
  scanf( "%d", &n );
  return d;
}

int main(void)
{
  int n = get_int();

  int lonely = 0;
  while (n --> 0)
    lonely ^= get_int();

  printf( "%d\n", lonely );
}
xzlaal3s

xzlaal3s7#

function lonelyInteger(a){
 let n = [1,2,3,4,3,2,1];
 let unique = a.filter(function(value){
 return a.indexOf(value) === a.lastindexOf(value)
 })
 retun unique[0]
 }

相关问题