如何使用单个数组在数组中查找副本

时间:2015-07-19 15:12:21

标签: arrays

我遇到了一个代码,它能够使用相同的特定数组在数组中找到副本,但是当默认数组包含负值时,它无法正常工作

void printRepeating(int arr[], int size)
{
      int i;  

      printf("\n The repeating elements are");

      for(i = 0; i < size; i++)
      {
        if(arr[abs(arr[i])] > 0)
          arr[abs(arr[i])] = -arr[abs(arr[i])];
        else
          printf(" %d ", abs(arr[i]));
      }         
    }     

    int main()
    {
      int arr[] = {1, 3, 2, 2, 1};
      int arr_size = sizeof(arr)/sizeof(arr[0]);
      printRepeating(arr, arr_size);
      getchar();
      return 0;
    }

这是我发现的代码,它对正值有效,但对负值无效。任何建议都会很棒

1 个答案:

答案 0 :(得分:0)

我想知道这是怎么回事。看看代码。你有一个printRepeating函数,它需要一个数组,表示元素集和一个整数,表示元素集的大小。到目前为止,这么好了

在此函数中,您使用元素值作为索引。这不是应该怎么做的事情。如果这些元素是否定的,那么它们就会超出范围。这是你正确观察到的。此外,如果这些元素大于或等于大小,则尝试使用数组外的元素。这是问题的句法层面。

让我们看看语义。让我们假设即使有大的正数或负数,我们也不会有任何出界问题。让我们关注算法的概念。它否定了给定索引的符号,并在下一次出现时再次否定。当不是目的时,更改数组的值并不优雅。在某些情况下,当更改元素值不是一个选项时,您应该只在您想要的时候更改它们。让我们看看你是否喜欢这个:

void printRepeating(int arr[], int size)
{
      int i;
      int j;

      printf("\n The repeating elements are");

      for(i = 0; i < size; i++)
      {
        for (j = i + 1; j < size; j++)
        {
          if (arr[i] == arr[j]) {
              //handle the duplicate
              j = size;
          }
        }
      }         
} 

编辑:

根据新描述的需求,您需要两个功能: - isDuplicate - insertElement

int isDuplicate(int arr[], int size, int newElement) {
    int i;
    for (i = 0; i < size; i++) {
        if (arr[i] == newElement) {
            return 1;
        }
    }
    return 0;
}

int insertElement(int arr[], int size, int newElement) {
    int dupe = isDuplicate(arr, size, newElement);
    if (dupe == false) {
        arr[size] = newElement;
    }
    return dupe;
}