假设我们有一个大小为n的数组,其值范围为0到n-1。 无需使用其他数组,需要一个验证不存在值重复的函数。
原型:bool UniqueValues(unsigned arr [],size_t n);
这是求职面试的算法问题,请不要建议使用内置的std函数。
答案 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.