https://leetcode-cn.com/problems/move-zeroes/

一 题目

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

示例: 输入: [0,1,0,3,12]

输出: [1,3,12,0,0]

说明: 必须在原数组上操作,不能拷贝额外的数组。

尽量减少操作次数。

二 题解

  1. class Solution {
  2. public void moveZeroes(int[] nums) {
  3. int length = nums.length;
  4. int zeroTag = 0;
  5. // 找到第一个为0的位置
  6. while(zeroTag<length){
  7. if(nums[zeroTag]==0){
  8. break;
  9. }
  10. zeroTag++;
  11. }
  12. int positiveTag = zeroTag;
  13. while(positiveTag<length){
  14. if(nums[positiveTag]!=0){
  15. nums[zeroTag] = nums[positiveTag];
  16. nums[positiveTag] = 0;
  17. zeroTag ++;
  18. }
  19. positiveTag++;
  20. }
  21. }
  22. }

三 题解二

对于数组 nums 取一个指针index,指向数组头部,即index = 0;
遍历数组,如果遍历的值不为0,则赋值给数组 index 位置,并将index指针后移,即 index++;
如果遍历的值为0,则继续下一轮遍历。
一轮遍历过后,便将数组中不为0的数放于数组 index位置之前。
最后再对 index及之后的位置赋值 0 。

  1. class Solution {
  2. public void moveZeroes(int[] nums) {
  3. int index = 0;
  4. for (int num : nums) {
  5. if (num != 0) {
  6. nums[index++] = num;
  7. }
  8. }
  9. for (int i = index; i < nums.length; i++) {
  10. nums[i] = 0;
  11. }
  12. }
  13. }