问题描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
解题思路
思想挺巧妙的,值得记录一下
- 题目中要求只能在原有的数组中操作,且不申请额外数组,操作次数要少
- 理解:相对顺序:就是除去0外,原有的元素的相对排序,并非排序
- 重新变换的数组:只有非0的保持原有顺序,其余都是0
- 解题关键在于:按顺序记录非0元素的,其余位置为0
- 则对数组重复赋值即可
实现
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null||nums.length==0){
return;
}
int index =0;
for(int i =0;i<nums.length;i++){
if(nums[i]!=0){
nums[index++]=nums[i];
}
}
for(int j = index ;j<nums.length;j++){
nums[j]=0;
}
}
}
对数组重新赋值,即坐标从0开始赋值即可。