验证数组没有重复值

时间:2012-12-27 19:21:27

标签: c++ arrays algorithm

假设我们有一个大小为n的数组,其值范围为0到n-1。 无需使用其他数组,需要一个验证不存在值重复的函数。

原型:bool UniqueValues(unsigned arr [],size_t n);

这是求职面试的算法问题,请不要建议使用内置的std函数。

3 个答案:

答案 0 :(得分:4)

遍历数组并为每个元素,在arr [i]的索引中用arr交换arr [i](例如,如果arr [1] = 2,则用arr [2]交换它,所以arr [2] = 2)。 值是否重复的指示是arr [arr [i]] == arr [i]。 (在arr [2]已经有2的时候找到了2。)

bool UniqueValues(unsigned arr[], size_t n)
{
    int val;
    for(size_t i=0;i<n;i++)
    {
        val = arr[i];
        if(val == arr[val] )  { if( val != i) return false; }  //  If the element is duplicated
        else {
            swap( arr[i], arr[val] );  //  Move the element to the index matching its value
            val = arr[i];
            if(val == arr[val] )  return false;  //  Another check for the swapped element
        }
    }
    return true;
}

答案 1 :(得分:1)

快速测试是对数组中的数字求和,然后对下标求和。如果两者不相等,那么可能会有重复。

对于更强的语句对数组进行排序。值应与下标对齐。

答案 2 :(得分:1)

一种解决方案是(伪代码)

loop from i = 0 while i is smaller than length of array {
  loop from j = i + 1 while j is smaller than length of array {
    if array at index i equals array at index j {
      duplicate found. terminate the algorithm
    }
  }
}

no duplicate found.