欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

九章算法 | Facebook面试题:移动零

程序员文章站 2022-07-14 17:23:00
...

给一个数组 nums 写一个函数将 ​0​ 移动到数组的最后面,非零元素保持原数组的顺序

1.必须在原数组上操作

2.最小化操作数

在线评测地址:LintCode 领扣

例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的数就赋值给新数组的指针位置,并将新数组指针向后移动

代码思路

  1. 将两个指针先指向0,即数组头部
  2. ​right​向后扫描,当遇到非0数即​nums[right] != 0​时,将其赋值给新数组指针指向的位置,即​nums[left] = nums[right]​,并将​left​向后移动一位
  3. 若新数组指针还未指向尾部,即剩余的位置都是0,将剩余数组赋值为0

复杂度分析

N表示数组​nums​长度

  • 空间复杂度:O(1)
  • 时间复杂度:O(N)
public class Solution {
    /**
     * @param nums an integer array
     * @return nothing, do this in-place
     */
    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++;
        }
    }
}

更多题解参考:九章算法