题目:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
提示:
1 <= nums.length <= 104
-2^31 <= nums[i] <= 2^31 - 1
解题思路
由于是不允许创建新的数组,可以考虑指针。
也就是我们可以通过一个指针判断现在我存储非零数组到那里了,最终判断到末尾之后,我们可以考虑剩下的位置全部置0。
示例:
0 1 0 3 2
我们可以利用i对数组进行遍历,用蓝色指针表示,此时如果来一个非零元素存储位置,我们用黄色指针表示。
此时判断第一个元素为零,所以i继续往后移动,而第一个元素值为0,所以黄色指针不动。
此时由于第二个元素,非零,所以黄色指针位置元素设置为1,i继续往后走,此时黄色指针往后移动。
由此递归下去,最终可以得到所要的数据。
代码实现
class Solution {
public void moveZeroes(int[] nums) {
int i =0,zeros_num=0;
for(;i<nums.length;i++){
if(nums[i]==0){
zeros_num++;
}
else{
nums[i-zeros_num]=nums[i];
}
}
int t =i-zeros_num;
for(;t<nums.length&&t>=0;t++){
nums[t]=0;
}
}
}