思路:在原本数组里面操作,我们可以借鉴一下冒泡排序的交换操作。
一旦我们遇到0,那么这个时候我们就开始冒泡排序的交换操作,把它换到最后面。
注意:我们在交换之后,第一重循环会直接往下进行判断数,但是我们交换之后,会有数往前去,就相当于我们把0扔到后面了,整体数组是向前移动的。所以我们还是需要从原先的位置判断,这个时候i--,下一次操作的时候还是在原位置进行判断新的数。
还有就是,在我们把0都扔到最后面之后,再次判断末尾的时候会有问题,因为我们每次交换操作之后,会把i--,但是在末尾全是0的时候,我们其实不用进行交换了,也就是交换操作不会进行,但是我们的i还是会递减,这样就造成了一个死循环。
所以我们增加了一个计数变量cnt,每次扔一个0,就加1,然后我们把它放在循环条件里面,减去它,这样我们就不会遍历到后面已经被我们扔到末尾的0了,死循环就不会产生了。
class Solution {public void moveZeroes(int[] nums) {int cnt=0;for(int i=0;i<nums.length-cnt;i++){if(nums[i]==0){for(int j=i;j<nums.length-1-cnt;j++){int tmp=nums[j+1];nums[j+1]=nums[j];nums[j]=tmp;}cnt++;i--;}}}
}