22.1.9
移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2ba4i/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution { public void moveZeroes(int[] nums) { for(int i=0;i<nums.length;i++){ for(int j=i+1;j<nums.length;j++){ if(nums[i]==0){ int temp=nums[j]; nums[j]=nums[i]; nums[i]=temp; } } } } }
执行结果:
通过
显示详情
执行用时:245 ms, 在所有 Java 提交中击败了5.01%的用户
内存消耗:39.5 MB, 在所有 Java 提交中击败了81.31%的用户
通过测试用例:74 / 74
class Solution { public void moveZeroes(int[] nums) { int temp=0; for(int i=0;i<nums.length;i++){ if(nums[i]!=0){ nums[temp++]=nums[i]; } } for(;temp<nums.length;temp++){ nums[temp]=0; } } }
ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:39.1 MB, 在所有 Java 提交中击败了97.55%的用户
通过测试用例:74 / 74
两种思路
同样是双指针,差别怎么这么大..
public void moveZeroes(int[] nums) { int i = 0;//统计前面0的个数 for (int j = 0; j < nums.length; j++) { if (nums[j] == 0) {//如果当前数字是0就不操作 i++; } else if (i != 0) { //否则,把当前数字放到最前面那个0的位置,然后再把 //当前位置设为0 nums[j - i] = nums[j]; nums[j] = 0; } } } 作者:数据结构和算法 链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2ba4i/?discussion=AJ2rEF 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。