数组中某元素的删除

思路就是从前向后扫描数组,记录有遇到有是待删除元素的记录个数,后面的元素均向前移动这个个数个位置,将待删除元素覆盖,但有一点要注意的是这个并不是真正的移动,与其说移动,倒不如说是覆盖,也就是原来位置上的元素并没有移走,而是依靠后面的元素覆盖,因此,最后需要一个收尾工作
对于char 数组,则是如下代码,即在向前移动后的最后一个位置加上’\0’
对于int 或double数组,只要把修改len的值即可

void mydelete(char*a,char ch,int len){//a为数组,ch为待删除元素,len为数组长度
    int i,j=0;
    for(i=0;i<len;i++){
        if(a[i]==ch){
            j++;
        }
        else a[i-j]=a[i];
        }
    a[len-j]='\0';
    }

如输入 i love you
希望删除空格
|0|1|2|3|4|5|6|7|8|9
|i| |l|o|v|e| |y|o|u
遇到 a[1] j=1;
后面四个非空格均向前移一个位置
|0|1|2|3|4|5|6|7|8|9
|i| |l|o|v|e|e| |y|o|u
直到再次遇到a[6]位置的空格,这时j=2
you则再次向前移两个单位
|0|1|2|3|4|5|6|7|8|9
|i| |l|o|v|e||y|o|u|o|u
再令a[8]=’\0’
即完成了收尾工作
时间复杂度为n
空间复杂度为1

不过现在学了线性表之后,对于这种插入和删除(尤其不是在尾部插入和删除的)比较多的建议使用链表进行,将极大提升效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值