我遇到了一个代码,它能够使用相同的特定数组在数组中找到副本,但是当默认数组包含负值时,它无法正常工作
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;
}
这是我发现的代码,它对正值有效,但对负值无效。任何建议都会很棒
答案 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;
}