题目
删除顺序结构线性表中的零元素,不改变原表的顺序。
input:
10,2,0,0,5,7,0,4,0,0
output:
10,2,5,7,4
解决
解法一
发现一个零元素,就删除一个。将后面的元素前移,数组长度减一。
解法二
开始:设置两个指针变量,储存数组的下标。
在遍历数组过程中,让左指针指向非零元素后出现的第一个零元素,右指针指向零元素后出现的第一个非零元素。
达成条件后,交换左右指针所指元素,左指针右移一位。
交换完毕后继续遍历,直到数组右侧全是零元素。
结束:此时左指针指向第一位零元素,只需要将数组的长度设置为左指针减一即可。
解法三
遍历数组,当出现零元素的时候,用一个变量k记录数组中为零元素的长度,碰见非零元素的时候,让非零元素前移k个位置。
直到数组遍历完毕。将数组的长度设置为原长减k即可。
吐槽:
- 解法三我在看的时候,还以为会漏掉元素,或者,受前一个用交换的解法惯性影响担心:用前移的办法,后面的非零元素没有改变,会影响到下一次 “交换” 操作。
- 但是这个解法没有用上交换,而是在前移的过程中直接覆盖掉前面遗留下来的元素。
- 这其实很好理解,由零元素长度形成的一个不断增长的挡板将判断过的非零元素覆盖掉,因而不用改变后面的非零元素,最后挡板移到数组末尾,问题解决。
延伸
这类问题可以理解为在遍历线性表时,记录下满足条件的元素个数k(可以是x—y范围内的元素个数),对于不满足条件(x—y范围外的元素),前移k个位置,最后修改线性表的长度。
对于原题,这个条件范围缩小到等于0,非零元素前移。