移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入:[0,1,0,3,12]
输出:[1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
两种方案:
第一种排水法(drain) 标准库里的drain函数挺有意思。
思路不是0就添加到vec末尾,新vec长度与之前的长度的2倍比较,不够就补充0。然后drain(..len) ,排出去。
let len0 = nums.len(); for i in 0..len0{ if nums[i] != 0 { nums.push(nums[i]) } } let len1 = nums.len(); for _ in len1..2*len0{ nums.push(0) } nums.drain(..len0);
第二种是替换法,先声明标志位,最开始是0。迭代数组,是0就不用管了,不是0,
标志位替换为这个数,然后标志位加1,继续迭代。最后标志位和长度之间的所有元素替换为0;
let len = nums.len(); let mut j = 0; for i in 0..len{ if nums[i] != 0 { nums[j] = nums[i]; j = j + 1; } } for i in j..len{ nums[i] = 0; } for e in nums.iter(){ print!("{} ",e) }