我试着编写一个函数来检查两个数组是否相互排列

时间:2017-01-30 20:42:10

标签: c arrays

使用计数。它给出了数组的值只能在1到100之间。看来我的功能不正确我不明白为什么。 这是我的功能:

int CheckPermutation3(int arr1[], int arr2[], int size)
{
    int count1[100], count2[100]; //the size 100 because in that case values are only between 1 and 100//
    int i;

    for(i=0; i<100; i++)
    {
        count1[i]=0;
       count2[i]=0;
    }
    for(i=0;i<size;i++)  //counting the elements of each array//
       count1[arr1[i]]++;
    for(i=0;i<size;i++)
        count2[arr2[i]]++;
    for(i=0;i<100;i++)   //comparison//
        if (count1[i]!= count2[i])
            return 0;
    return 1;
}

2 个答案:

答案 0 :(得分:1)

您的实现没有任何问题:唯一的原因是项目超出范围,因为这会导致未定义的行为。

您可以通过使用单个数组来简化代码,如下所示:

int balance[100] = {0}; // Initialize all elements to zero
for (i = 0 ; i < size ; i++) {
    balance[arr1[i]-1]++;
    balance[arr2[i]-1]--;
}
for(i=0;i<100;i++) {
    if (balance[i] != 0) {
        return 0;
    }
}
return 1;

答案 1 :(得分:0)

似乎只有一个问题,为什么它可能无法正常工作。

在索引为[0-99]的数组中,存储的值介于1到100之间[包含,我猜]。 因此,如果arr1 [i]值为100,那么它就会在此处中断。
count1[arr1[i]]++;
因为你试图增加count1 [100]超出范围。

同样,如果arr2 [i]值为100,它就会在此处中断。
count2[arr2[i]]++;

解决这个问题:
1.创建一个101大小的数组。
2.从1到100迭代[包括]
for(i=1;i<=100;i++) //comparison// if (count1[i]!= count2[i]) return 0;

如果你想节省一些空间,让数组大小为100, 这样做 count1[arr1[i]-1]++;
同样,对于arr2
count2[arr2[i]-1]++;
这样您就可以将每个值存储在数组中的prev值的位置。 [0th indexing]