题目来自leetcode初级算法的数组
-
方案一
因为这个数组是有序的,所以删除的时候可以这样做。使用最小数字减去1来标记作为被删除掉的元素。然后再把数组中的有效元素移动位置就可以了。使用C语言实现如下:
int removeDuplicates(int* nums, int numsSize) {
int temp = nums[0];
int count = 1;
int j;
if(0 == numsSize) //若没有数组,则返回0
{
count = 0;
}
else
{
for (int i = 1; i < numsSize; i++)
{
if (temp == nums[i])
{
nums[i] = nums[0] - 1; //标记删除
}
else
{
temp = nums[i];
count++; //纪录删除后的元素个数
}
}
for (int i = 1; i < numsSize; i++)
{
if (nums[0] - 1 == nums[i]) //删除掉的元素
{
for (j = i + 1; nums[0] - 1 == nums[j] && j < numsSize; j++);//下一个有效元素
if (nums[0] - 1 != nums[j] && j < numsSize)
{
nums[i] = nums[j]; //移动它
nums[j] = nums[0] - 1;//删除它
}
}
}
}
return count;
}
这样做其实比较麻烦的。我提交了之后看了一下解法,使用的办法比较简单。
-
方案二
只去看它后面的元素是否有和它相同,若有相同则把该元素移动到当前位置的下一个位置即可。然后继续向后找看是否有相同的元素。该算法也是简单的,比较易理解的。
int removeDuplicates(int* nums, int numsSize) {
int i = 1;
if(0 == numsSize)
{
i = 0;
}
else
{
for(int j = 1; j < numsSize; j++)
{
if(nums[j] != nums[i])
{
i++;
nums[i] = nums[j];
}
}
}
return i;
}