LeetCode 283. 移动零(C#实现)——数组

时间:2021-04-08 18:02:00

一、问题

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

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

示例:

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

说明:

    必须在原数组上操作,不能拷贝额外的数组。
    尽量减少操作次数。

二、GitHub实现:https://github.com/JonathanZxxxx/LeetCode/blob/master/MoveZeroesClass.cs‘’

  Blog:https://www.cnblogs.com/zxxxx/

三、思路

  index标识非零的个数,循环遍历数组;如果不是0,就将非零的值移到index位,index加一;遍历结束后,再次遍历,index后的位置都为0

  优化思路:不需要第二次遍历,第一次遍历数组时判断下标是否等于index,不等于就将当前值置为零

四、代码实现

    public class MoveZeroesClass
    {
        public void MoveZeroes(int[] nums)
        {
            if (nums == null || nums.Length == 0) return;
            //非零个数
            var count = 0;
            for (int i = 0; i < nums.Length; i  )
            {
                //非零值移到当前指针位置
                if (nums[i] != 0)
                {
                    nums[count] = nums[i];
                    count  ;
                }
            }
            //当前指针位置后都为0
            for (int i = count; i < nums.Length; i  )
            {
                nums[i] = 0;
            }
        }

        public void MoveZeroes2(int[] nums)
        {
            if (nums == null || nums.Length == 0) return;
            var current = 0;
            for (int i = 0; i < nums.Length; i  )
            {
                if (nums[i] != 0)
                {
                    nums[current] = nums[i];
                    //num[i]值置0
                    if (current != i)
                    {
                        nums[i] = 0;
                    }
                    current  ;
                }
            }
        }
    }