题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
运行结果
图片说明
解题思路
双指针:一个指向排好的后一位,一个指向待排的元素
当待排元素为0时,直接待排指针右移
当待排元素不为0时,如果两个指针相等(则证明前边没0),则双指针都右移。否则左右指针数据交换后都右移。----又因为这种情况下,左指针一定为0,可以直接使用

java代码

class Solution {
    public void moveZeroes(int[] nums) {
        //循环:如果之前有0,则找到最左边的0与之交换
        /*int n=nums.length;
        boolean tag=false;
        for(int i=0;i<n;i++){
            if(nums[i]==0){
                tag=true;
            }
            else if(tag==true){
                for(int j=i-1;j>=0;j--){
                    if(nums[j]!=0){
                        nums[j+1]=nums[i];
                        nums[i]=0;
                        break;
                    }
                    else if(j==0){
                        nums[0]=nums[i];
                        nums[i]=0;
                    }
                }
            }
        }*/
        //双指针:左指针指向左侧非零,右指针指向待排数
        int left=0,right=0;
        while(right < nums.length){
            if(nums[right]!=0){
                if(left != right){
                    //int temp=nums[left];
                    nums[left]=nums[right];
                    nums[right]=0;
                }
                left++;
            }
            right++;
        }

    }
}