2017-04-25 54 views
0

我正在做一个C程序,它需要将一组值(整数)转换为二维数组,然后对其执行某些数学运算。我决定在用户​​输入值时,在程序中执行检查,以避免它们输入已存在于数组中的值。避免二维数组中的重复?

但我不确定如何去做这个检查。我发现我可能需要某种递归函数来检查输入的元素之前的所有元素,但我不知道如何实现它。

请找我的用于说明目的的代码片段如下:

ROW和COL的值由用户输入该阵列的尺寸

for (int i=0; i<row;i++){ 
    for (int j=0; j<col; j++){ 
     scanf("%d", &arr[i][j]); //take in elements 
    } 
} 
for (int i = 0; i < row; i++) 
    { 
     for (int j = 0; i < col; j++) 
     { 
      if (arr[i][j] == arr[i][j-1]){ 
       printf("Duplicate.\n");} 
      else {} 
      } 

    } 

我知道这可能是不正确的,但这是我的尝试。 任何帮助将不胜感激。

+1

可以对一个或两个维度中的值进行排序吗? – BurnsBA

+0

对于一维数组,我没有任何问题,但事实上这是一个二维数组,它使我很困惑...... @BurnsBA –

+2

你知道'='不是比较运算符,对吗? – user694733

回答

1

我会建议您存储您在临时一维数组中读取的每个元素。每次扫描一个新元素时,遍历一维数组检查值是否存在。虽然这不是最佳的,但每次都会比遍历2D阵列便宜。

实施例:

int temp[SIZE]; 
int k,elements = 0; 
for (int i = 0; i < row; i++) { 
    for (int j = 0; j < col; j++) { 
     scanf("%d", &arr[i][j]); //take in elements 
     temp[elements] = arr[i][j]; 
     elements++; 
     for (int k = 0; k < elements; k++) { 
      if (temp[k] == arr[i][j]) 
       printf("Duplicate.\n"); //or do whatever you wish 
     } 
    } 
} 
+0

在C中,二维数组的实现与1D相同,所以差异可以忽略不计。 –

+0

@ivan_pozdeev呃,不,它们被实现为一维数组的一维数组。布局当然是第二行的元素,紧跟在第一行的元素之后,没有附加的填充,标准保证了这一点。但是,这不允许将二维数组打到“int *”类型,并将数据作为一维数组访问(如for(int i = 0; i cmaster

+0

@cmaster [是吗?](http://stackoverflow.com/questions/ 2151084/map-a-2d-array-on-a-1d-array-c/33406032#33406032) –

1

balanced tree插入和搜索在为O(log N)时间。

由于算法非常简单&标准和高德纳,there are plenty of implementations out there发表在开创性的著作,包括a clear and concise one at codereview.SE(因而是自动CC-BY-SA 3.0; 做在答题应用修正错误)。使用它(以及几乎任何其他)很简单:以node* root = NULL;,然后insertsearch,最后free_tree开始。


渐近,最好的方法是hash tableO(1)两个,但是这可能是矫枉过正(的算法更复杂和内存占用较大),除非你有很多数字为。对于C++,有一个标准实现,但there are plenty 3rd-party ones for C也是。


如果你的输入值的数量少,连树可能是矫枉过正,并简单地翻翻以前的值就足够快。 If your 2D array is contiguous in memory, you can access it as 1D with int* arr1d = (int*)&arr2d

+1

没有。渐近地说,最好的算法是一个哈希表:它在O(1)时间插入和搜索。 – cmaster

+0

@cmaster哦,sh#t,我忘记了哈希表!但这绝对是一个矫枉过正的问题。 –

+0

哈希表对此过度杀伤:-) – cmaster