1、题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
2、解答思路
已知数组后端若干元素为0,因此只需遍历查询到非零元素并依次赋值到数组前端(无需交换),最后将后端的值均设置为0即可。
class Solution {
public void moveZeroes(int[] nums) {
// 用于记录非零元素的下标
int index = 0;
for (int i = 0; i < nums.length; i++) {
if(nums[i]!=0) {
// 将非零元素依次赋值给nums[index],因此相对顺序也不会变
nums[index++] = nums[i];
}
}
// 从最后一个非零元素到末尾,均赋值为0
for (int i = index; i < nums.length; i++) {
nums[i] = 0;
}
}
}
- 本题关键点在于下标 i 和 index 的变化,i 用于遍历整个数组,index 用于存储非零元素。
- 时间复杂度:o(n)。主要时间花销是for循环遍历整个数组。