双指针
class Solution {
public void moveZeroes(int[] nums) {
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
int tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
j++;
}
}
}
}
- j是会不断维护他当前位置为0,除了最开始nums[0]!=0这样也可以通过j++保证始终维护0,然后i就寻找该位置不为0的元素和j进行交换
使用数组模拟栈
class Solution {
public void moveZeroes(int[] nums) {
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
nums[j]=nums[i];
j++;
}
}
Arrays.fill(nums,j,nums.length,0);
}
}
- 把数组当做栈来模拟,如果有非0的数就向前移动,最后全部填0
- 但是这个方法最坏的情况下也就是nums全部都为0,要对数组进行两次遍历 Arrays.fill(arr, fromIndex, toIndex, val)也要隐性地进行一次遍历