6.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
思路:
1 2 2 3 4 4 5
可以再建立一个数组,因为是有序的,进行一次一次的遍历
如果不同,我们就将它再乘数组,这样就可以了,
但是它的空间复杂度就变大了
然后我们最好的方式就是能够就地处置
也可以直接进行相应的遍历,如果不同就将它存入到当前变量的相应位置
例如
1和第二个元素2不相同,我们就把它又重新赋值过来
2和第三个元素2相同,不管它,继续遍历
2和第四个元素3不相同,把2放到相应的第二个位置
3和第五个元素4不想同,把3放到相应的第三个位置
4和第六个元素4相同,继续遍历
4和第七个元素5不相同,把4放到相应的第四个位置
5和后面元素是否相同未知,先把5放到相应的第五个位置
但一般情况下是不想同的,如果相同,就进行一个处置处理就行了
现在,恰好最后一个就是一个空,我们没有使用空间里面存的
操作前的数组:1 2 2 3 4 4 5
操作后的数组:1 2 3 4 5
这样的话空间复杂度:O(1),时间复杂度O(n)
#include<stdio.h>
int deleteRepitition(int *arr,int len){
//由于C语言无法直接修改数组长度,我们返回去重后的数组长度
int k=0;//用来记录当前下标
for(int i=0;i<len;i++){
if(*(arr+i)-*(arr+i+1)){
*(arr+k++)=*(arr+i);
}
return k;
}
if(*(arr+len-1)==*(arr+len)){//如果最后一个元素恰好和后一个存储空间元素相等,则需单独处理
*(arr+k++)=*(arr+len-1);
}
return k;
}
int main(){
int arr[]={1,1,2,2,3,3,4,5};
int len=sizeof(arr)/sizeof(int );
len=deleteRepition(arr,len);//函数deleteRepitition将数组和长度都传进去
for(int i=0;i<len;i++)
printf("%d ",*(arr+i));
return 0;
}