【问题标题】:Find the lonely integer in an array找出数组中唯一的整数
【发布时间】:2015-03-31 15:26:21
【问题描述】:

如果可以的话,请参考thishackerrank挑战。

问题是在数组中找到孤独的整数,给定一个数组只包含一对,除了一个孤独的整数。

问题出在这个测试用例上

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;
}

【问题讨论】:

  • 如何知道在“n”初始化之前数组应该有多大(即“n”是什么)?
  • 但为什么它适用于 4 个测试用例中的 3 个?
  • 请您自己考虑一下:int arr[n]; scanf("%d", &amp;n);您定义了一个大小为 n 的数组,并且 n 的值为 [nothing here],然后您扫描大小...(顺便说一句:如果您有写 cmets 像://n is size of array, i is counter variable 那么你的变量名不够有意义,把它们改成 counter and size or arraySize)
  • 如果有缺陷的代码通过了一些测试,那就没有任何意义。 C 中的错误代码非常难以预测。该软件很有可能通过您的所有测试,但是当您在老板的计算机上运行它时,它可以决定删除您老板的所有文件。如果测试失败,它会告诉你一些事情;但是如果测试通过了,它什么也不会告诉你。
  • 为什么要将整数存储在数组中?您可以在读取整数时一次只对整数进行计算,这可能会为您节省大量内存并始终为您节省分配内存的复杂性。

标签: c arrays pointers scanf


【解决方案1】:
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]
 }

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
  • 这个问题专门针对 C。这不是 C,所以这不能回答问题。
【解决方案2】:

'n' 的值必须在使用之前定义。就像你正在使用的一样

int arr[n];

在读取 'n' 的值之前。所以编译器不会知道,数组“n”中有多少元素可能是垃圾值。它应该为数组分配多少内存。

因此您必须先读取 'n' 的值,然后再将其用作数组定义。

【讨论】:

    【解决方案3】:

    问题中给出的n 的范围是1 &lt;= N &lt; 100,它很小,可以使用variable length array。但是你在这里做错了

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

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

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

    【讨论】:

      【解决方案4】:

      你想使用:

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

      这样,arr 在运行时动态分配,因此它可以是任意大小,具体取决于输入 n

      您最初所做的(即在通过 scanf 接收 n 后声明 arr[n]scanf("%d", &amp;n); int arr[n];)不是一个好主意,因为它利用了 可变长度数组,这是一个功能在最新的 C 标准中不是强制性的。

      你看,arr 是在编译时创建的,而你通常只能用编译时已知的常量表达式来初始化它,n,作为用户接收的变量输入,显然不是。可变长度数组是该语言的一项功能,它基本上允许您绕过此规则,即它们使您能够将数组初始化为编译时未知的长度。这已在 C99 中标准化,但在 C11 中被列为“可选”。

      您在那之后所做的 (int arr[n]; scanf("%d", &amp;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!
      

      【讨论】:

        【解决方案5】:

        使用未初始化的变量分配数组,将导致未定义的行为,编译器将抛出警告“在此函数中使用未初始化的变量”

        如果您在运行时获取数组的大小,最好使用@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
        

        【讨论】:

          猜你喜欢
          • 2015-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-07
          • 1970-01-01
          • 1970-01-01
          • 2010-12-09
          相关资源
          最近更新 更多