(2.2.4-6)从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
思路:例SqList L = { 1, 2, 2, 3, 4, 4 },将每一个元素与之后面的元素进行比较,1与2比较不相等不做任何处理,1再次与2比较不做任何处理,1与3比较不做任何处理…1与之后面的所有元素比较不做任何处理;2与2比较,相同第2个2删除即需要将之后的元素向前移动,3需要向前移动1步(即此轮(即内层循环的重复数)遍历的重复次数),后面的两个4需要向前移动1步;后面同理。内层每次比较完应该更新length为length-此轮重复次数。
代码如下:
void Delete_Same(SqList &L){
//删除有序表重复值
for(int i=0;i<L.length;i++)
{
int same=0;
for(int j=i+1;j<L.length;j++){
if (L.data[i] == L.data[j])
{
same++;
}
else{
L.data[j-same]=L.data[j];
}
}
L.length=L.length-same;
}
}
思路(转自https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-yuan-su-y/):
使用快慢双指针法 分别定义指针i与指针j,开始两指针都指向num[0],
快指针i向前移动 指向的数组与 慢指针j所知数组比较 num【j】!=num【i】
若相同则快指针向前移动一格,慢指针向前移动一格;若不同,将快指针i指向数组赋值给慢指针j,快慢指针分别向前移动一格;重复操作直到i指针指到末尾。
若数组长度为0则直接return 0;
最后 返回慢指针所指数组长度加一 return j+1。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i,j;
int length=nums.size();
if(length==0)//判断数组长度 若为0直接返回
return 0;
for (i=0;i<nums.size();i++)//采用for循环使指针i不停向前移动
{
if(nums[i]!=nums[j])
{
if(i-j>1) //判断快慢指针 若相邻数组且元素值不同时,虽然也可进行赋值操作,
//但可以省略该赋值操作,避免无意义操作提高运行效率
{nums[j+1]=nums[i];}
j++;
}
}
return j+1;
}
};