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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2022-01-09 21:01  AD2017  阅读(26)  评论(0)    收藏  举报