题目要求:给一个一维数组,将其中为0的元素删除掉,非零元素的相对位置保持不变,最终目标数组保留在原数组,目标长度之外的元素全部置为0。
Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].
Note:
You must do this in-place without making a copy of the array.
Minimize the total number of operations.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
最初的想法是先将非0的元素往前靠,最后再将剩下的位置重置为0,如下:
public void moveZeroes(int[] nums) {
if(nums.length<1)
return ;
int insertIndex=0;
for (int i=0;i<nums.length;i++){
if(0!=nums[i]){
nums[insertIndex++]=nums[i];
}
}
for(int i=insertIndex;i<nums.length;i++){
nums[i]=0;
}
}
但是其实可以用利用两个指针,一个指针永远指向从左往右第一个为0的元素,第二个指针为遍历指针,当遍历指针指向的值非0的时候,将这个元素与第一个指针指向的元素交换(这里要写好交换的逻辑,如果用与操作的话注意自身与为0的情况)
public void moveZeroes(int[] nums) {
//left指针永远指向当前为0的元素
int left = 0;
for (int right = 0; right < nums.length; right++) {
//为0的和非0的交换
if (nums[right] != 0) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
}
}
}