顺序表第六题(删除重复值)

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; 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值