LeetCode:1089. 复写零

2022-06-17  本文已影响0人  alex很累

问题链接

1089. 复写零

问题描述

给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。

要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

示例

示例1
输入:[1,0,2,3,0,4,5,0]
输出:null
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

解题思路

如果不限制“就地”的话,可以直接用栈来解决这个问题。
思路:统计0的个数后移位
遍历一次数组,统计0的个数;再从后往前遍历一次,根据当前位置左边的0的个数移动当前整数的位置。

代码示例(JAVA)

class Solution {
    public void duplicateZeros(int[] arr) {
        // 统计0的个数
        int countZero = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) {
                countZero++;
            }
        }
        if (countZero == 0) {
            return;
        }

        // 循环中的countZero可理解为当前位置左边h还有多少个0
        for (int i = arr.length - 1; i >= 0 && countZero > 0; i--) {
            if (arr[i] == 0) {
                countZero--;
            }
            if (i + countZero < arr.length) {
                arr[i + countZero] = arr[i];
                // 如果是0,复写
                if (arr[i] == 0 && i + countZero + 1 < arr.length) {
                    arr[i + countZero + 1] = 0;
                }
            }
        }
    }
}

执行结果

上一篇 下一篇

猜你喜欢

热点阅读