[leetcode/lintcode 题解] Facebook面试题:移动零
给一个数组 nums 写一个函数将 0 移动到数组的最后面,非零元素保持原数组的顺序
1.必须在原数组上操作
2.最小化操作数
在线评测地址:领扣题库官网
例1:
输入: nums = [0, 1, 0, 3, 12],输出: [1, 3, 12, 0, 0].例2:
输入: nums = [0, 0, 0, 3, 1],输出: [3, 1, 0, 0, 0].算法:双指针
算法思路
- 使用两个指针right和left,left为新数组的指针,right为原数组的指针,原数组指针向后扫,遇到非0的数就赋值给新数组的指针位置,并将新数组指针向后移动
代码思路
- 将两个指针先指向0,即数组头部
- right向后扫描,当遇到非0数即nums[right] != 0时,将其赋值给新数组指针指向的位置,即nums[left] = nums[right],并将left向后移动一位
- 若新数组指针还未指向尾部,即剩余的位置都是0,将剩余数组赋值为0
复杂度分析
N表示数组nums长度
- 空间复杂度:O(1)
- 时间复杂度:O(N)
public class Solution {    /**     *      *      */    public void moveZeroes(int[] nums) {        //将两个指针先指向数组头部        int left = 0, right = 0;        while (right < nums.length) {            // 遇到非0数赋值给新数组指针指向的位置            if (nums[right] != 0) {                nums[left] = nums[right];                // 将left向后移动一位                left++;            }            right++;        }        // 若新数组指针还未指向尾部,将剩余数组赋值为0        while (left < nums.length) {            nums[left] = 0;            left++;        }    }}更多题解参考:九章官网solution
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号