给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入:[0,1,0,3,12]
输出:[1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
思路:重设另外一个数组,保存题目数组的非零元素,之后再设置第二个数组的没赋值的,赋值为 0 ,最后将第二个弄好的数组赋值给原先的数组,空间复杂度 O(n),时间复杂度 O(n)。
class Solution {
public void moveZeroes(int[] nums) {
int[] a = new int[nums.length];int temp = 0;
for(int i = 0; i < nums.length;i++ ){
if(nums[i] != 0){
a[temp] = nums[i];
temp++;
}
}
for(int j = 0; j < nums.length;j++){
if(a[j] != 0){
nums[j] = a[j];
}
}
for(int k = temp;k < nums.length;k++){
nums[k] = 0;
}
}
}
解法二:在原数组的基础上移动,不用其他辅助空间,从数组的第一个元素开始,往后扫描,如果遇到非零元素,就将元素赋值给第一个元素所在位置,直到全部非零元素移动到前面,此时再通过 temp 这个来赋值数组中的0。
class Solution {
public void moveZeroes(int[] nums) {
int temp = 0;
for(int i = 0; i < nums.length;i++) {
if(nums[i] != 0) {
nums[temp++] = nums[i];
}
}
for(int j = temp;j<nums.length;j++) {
nums[j] = 0;
}
}
}