题目链接: 283. 移动零 - 力扣(LeetCode)
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
暴力的话两层循环可以解决问题,但显然能不暴力就不暴力,这里有个O(n)的方法
反过来思考,直接先把不为0的元素放好,记录不是0的元素的位置i和数目one,遇到一个不为0的数直接放,最后的结果就是非0元素的相对顺序没变,然后把不为0元素后面的都变成0
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int byteDance = 0;
for (auto& num : nums)
if (num)
nums[byteDance++] = num;
while (byteDance < nums.size())
nums[byteDance++] = 0;
}
};
Rust
impl Solution {
pub fn move_zeroes(nums: &mut Vec<i32>) {
let mut zeros=0;
for i in 0..nums.len(){
if nums[i]!=0{
nums[zeros]=nums[i];
zeros+=1;
}
}
while zeros<nums.len(){
nums[zeros]=0;
zeros+=1;
}
}
}