283. 移动零
2022-08-04 本文已影响0人
水中的蓝天
给定一个数组 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++;
}
}
}