/*
    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

    思路1:
    1.统计0的个数,然后遍历数组,遇到非0的就移动到左边,剩下的位置全部置为0
    思路2:
    1.做一次循环,遍历数组
    2.开一个index下标,记录当前非0元素的位置
    3.遇到一个非0元素(i),就把他放到记录的index的位置
    4.把i位置的元素置为0,并且j++
    */

    1. /**
    2. * 思路2:
    3. * * 1.做一次循环,遍历数组
    4. * * 2.开一个index下标,记录当前非0元素的位置
    5. * * 3.遇到一个非0元素(i),就把他放到记录的index的位置
    6. * * 4.把i位置的元素置为0,并且j++
    7. * @param nums
    8. */
    9. public void moveZeroes2(int[] nums) {
    10. int j = 0;
    11. for(int i = 0; i < nums.length; i++){
    12. if(nums[i] != 0){
    13. nums[j] = nums[i];
    14. // 当两个index不相等的时候,才赋值为0,否则有可能第一个位置不是0,结果直接赋值一个0
    15. // 比如:[1,0,2,0,4,5],假如不做判断,那么第一个位置就直接为0了,是错的
    16. if (i != j){
    17. nums[i] = 0;
    18. }
    19. j++;
    20. }
    21. }
    22. }
    23. /**
    24. * 思路3:
    25. * * 1.做一次循环,遍历数组
    26. * * 2.开一个index下标,记录当前非0元素的位置
    27. * * 3.遇到一个非0元素,就把它和记录到的j做位置交换
    28. * @param nums
    29. */
    30. public void moveZeroes3(int[] nums) {
    31. int j = 0;
    32. for(int i = 0; i < nums.length; i++){
    33. // 当遇到不为0的,就把j和i位置的元素做交换
    34. if(nums[i] != 0){
    35. int tmp = nums[i];
    36. nums[i] = nums[j];
    37. // j++先取数,再自增
    38. nums[j++] = tmp;
    39. }
    40. }
    41. }