题目描述:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
题解1:
我的思路,使用双指针,l指针代表下一个非0元素需要插入的位置(l之前已经是按顺序排好的非0元素),r指针表示下一个非0元素,初始l指针指向0,r(i)指向0,找到第一个非0的index之后,将其交换在l指针所指位置,之后l+1,作为下一个非0元素的存放位置,r继续找下一个非0元素,交换在l所指位置,直到r指向最后一个元素。
代码实现:
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null){
return;
}
int l = 0;
for(int i = 0;i<nums.length;i++){
if(nums[i]!=0){
int temp = nums[i];
nums[i] = nums[l];
nums[l++] = temp;
}
}
}
}
题解2:
和题解1类似,两遍遍历,第一遍将非0元素挤到前面,每找到一个非零元素,就将其放在j位置,j初始是0,然后j++,代表下一个非零元素要放在哪里,第二遍遍历将按需排好的非零元素的下一个位置(就是j)到数组末尾全部置为0(因为现在已经将全部非零元素排在数组最前面了)
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
//第一次遍历的时候,j就是下一个非零元素存放的位置
//遍历结束之后,j之前就是全部排好序的非0元素,j即j之后就是应该置为0的位置
int j = 0;
for(int i=0;i<nums.length;++i) {
if(nums[i]!=0) {
nums[j++] = nums[i];
}
}
//第二次遍历把末尾的元素都赋为0即可
for(int i=j;i<nums.length;++i) {
nums[i] = 0;
}
}
}