leetcode移动零
Given an integer array nums, move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
Note that you must do this in-place without making a copy of the array.
Example 1:
Input: nums = [0,1,0,3,12]
Output: [1,3,12,0,0]
Example 2:
Input: nums = [0]
Output: [0]
方法一:把非0的往前挪
把非0的往前挪,挪完之后,后面的就都是0了,然后在用0覆盖后面的。这种是最容易理解也是最容易想到的,代码比较简单,这里就以示例为例画个图来看下
public static void moveZeroes(int[] nums) {
int n=nums.length;
int index=0;
for (int i = 0; i < n; i++) {
if (nums[i]!=0){
//一次遍历,把非零的都往前挪
nums[index++]=nums[i];
}
}
//后面的都是0
while (index<n){
nums[index++]=0;
}
}
方法二:参照双指针解决
这里可以参照双指针的思路解决,指针j是一直往后移动的,如果指向的值不等于0才对他进行操作。而i统计的是前面0的个数,我们可以把j-i看做另一个指针,它是指向前面第一个0的位置,然后我们让j指向的值和j-i指向的值交换
public static void moveZeroes2(int[] nums) {
int i=0;//统计前面0的个数
for (int j = 0; j < nums.length; j++) {
if (nums[j]==0){//如果当前数字是0就不操作
i++;
}else if (i!=0){
//否则,把当前数字放到最前面那个0的位置,然后再把
//当前位置设为0
nums[j-i]=nums[j];
nums[j]=0;
}
}
}
方法三:非0与0交换
public void moveZeroes3(int[] nums) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
//只要不为0就往前挪
if (nums[j] != 0) {
//i指向的值和j指向的值交换
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
}
}
}
和方法一类似