1、题目描述
?2、算法分析
方法1:?
注意:只能在原数组上操作。
两个for循环解决问题:
第一个for判断数组中元素不为0的话,nums[j++] = nums[i]
第二个for循环最后的元素赋值为零就好
方法2:双指针
比如:[0,1,0,2,3]
left,right起初都指向的是元素0,当nums[right] != 0的时候,交换nums[left] nums[right],
要不然left++;
①left指向的是0的位置
②right和left之间的数是0,如果有0的话
使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。
右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。
注意到以下性质:
-
左指针左边均为非零数; -
右指针左边直到左指针处均为零。
3、代码实现
方法1:
import java.util.*;
class Solution {
public void moveZeroes(int[] nums) {
if(nums == null){
return;
}
int j = 0;
for(int i = 0;i < nums.length;i++){
if(nums[i] != 0){
nums[j++] = nums[i];
}
}
for(int i = j;i < nums.length;i++){
nums[i] = 0;
}
}
}
方法2:
import java.util.*;
class Solution {
public void moveZeroes(int[] nums) {
if(nums == null){
return;
}
int left = 0;
int right = 0;
int n = nums.length;
while(right < n){
if(nums[right] != 0){
swap(nums,left,right);
left++;
}
right++;
}
}
public void swap(int[] array,int left,int right){
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}
}
|