283. 移动零

2022-08-04  本文已影响0人  水中的蓝天

283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。

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

示例 2:
输入: nums = [0]
输出: [0]

提示:

1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1

题目解析:把数组中为0的元素移动到数组末尾,在不能新创建数组的情况下完成;数组中数字顺序不能改变

思路:直观想法遍历扫描每一个元素,遇到0就把这个元素跟末尾元素交换;但这样可能会打乱数组的元素顺序;
换一个思路 每扫描到一个非零的数字就把它向前移动,遇到零就跳过;这样循环往复就可以在保证顺序的情况下把非零数字都移动到前面,同时也相当于把零移动到数组的末尾



class Solution {

    public void moveZeroes(int[] nums) {
       
       //0.空数组或元素少于1个 不需要处理
       if(nums==null||nums.length<=1) return;

       //1.设可以保存非零数值的起始位置
       int curr = 0;
       //2.遍历交换非零数值到数组前面
       for(int i = 0;i<nums.length;i++) {
          //扫描到0就跳过
          if(nums[i]==0) continue;
          //来到这里说明不是0,那就移动数值到可以保存的索引位
          if(curr != i) {
              nums[curr] = nums[i];
              //移动完后补充当前位置数值为0
              nums[i] = 0;
          }
          curr++;
       }
    }
}

上一篇 下一篇

猜你喜欢

热点阅读