本篇文章介绍使用“双指针”的方法遍历有序数组,并完成数组重复元素的删除。
1、以一个整型有序数组为例
以一个整型有序数组为例,展示程序执行的过程。
注:图中左上角的数字为循环的次数。
2、代码实现
(1)对于整形有序数组
size_t removeDuplicates_int_array(int* arr, size_t count)
{
size_t slow = 0, fast = 1;
while (fast < count)
{
if (arr[fast] != arr[slow])
{
slow = slow + 1;
arr[slow] = arr[fast];
}
fast = fast + 1;
}
return slow + 1;//返回新数组的长度
}
(2)对于更一般的有序数组
size_t removeDuplicates_array(void* ptr, size_t count, size_t size, bool (*isEqual)(const void*, const void*))
{ //isEqual函数用于判断数组元素是否相等
size_t slow = 0, fast = 1;
while (fast < count)
{
if (!isEqual((char*)ptr + slow * size, (char*)ptr + fast * size))
{
slow++;
memcpy((char*)ptr + slow * size, (char*)ptr + fast * size, size);
}
fast++;
}
return slow + 1;//返回新数组的长度
}