移动零
给定一个数组 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
进阶:你能尽量减少完成的操作次数吗?
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/array-and-string/c6u02/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
双指针
自从Java_8 移除元素之后就对它念念不忘,这道题在此基础上进行了后边的数赋值为零的操作
先移除再加上
class Solution {public void moveZeroes(int[] nums) {int slow=0,fast=0;for(fast=0;fast<nums.length;fast++){if(nums[fast]==0){continue;}nums[slow]=nums[fast];slow++;}int i=slow;for(;i<nums.length;i++){nums[i]=0;}}
}
官方解答
class Solution {public void moveZeroes(int[] nums) {t(nums,0,0);}
//offset 偏移量public void t(int[] nums,int start,int offset){int temp;for(int i = start;i<nums.length;i++){if(i+offset<nums.length){temp = nums[i+offset];if(temp ==0){t(nums,i,offset+1);break;}else{nums[i] = temp;}}}if(offset>0){nums[nums.length-offset] = 0;}}
}
参考提高
用双指针和位置替换,把0和非0进行交换,0逐渐靠后,非0逐渐靠前
class Solution {public void moveZeroes(int[] nums) {int slow=0,fast=0,temp=0;for(fast=0;fast<nums.length;fast++){if(nums[fast]!=0){temp=nums[slow];nums[slow]=nums[fast];nums[fast]=temp;slow++;//continue;}// nums[slow]=nums[fast];//slow++;}/*int i=slow;for(;i<nums.length;i++){nums[i]=0;}*/}
}