数组中某元素的删除
思路就是从前向后扫描数组,记录有遇到有是待删除元素的记录个数,后面的元素均向前移动这个个数个位置,将待删除元素覆盖,但有一点要注意的是这个并不是真正的移动,与其说移动,倒不如说是覆盖,也就是原来位置上的元素并没有移走,而是依靠后面的元素覆盖,因此,最后需要一个收尾工作
对于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
不过现在学了线性表之后,对于这种插入和删除(尤其不是在尾部插入和删除的)比较多的建议使用链表进行,将极大提升效率