力扣题解:1089. 复写零

115 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

一、题目描述:

1089. 复写零 - 力扣(LeetCode)

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

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

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

 

示例 1:

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

示例 2:

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

  提示:

1 <= arr.length <= 10000 0 <= arr[i] <= 9

二、思路分析:

  1. 获取数组长度length;定义count为已循环过的0的个数;
  2. 遍历数组,找到其中为0的元素,并在它后面(index + count)插入一个0;
  3. 在新数组长度超过length后,移除length位置上的元素;

三、AC 代码:

class Solution {
    func duplicateZeros(_ arr: inout [Int]) {
        var count = 0
        let length = arr.count
        for (index,item) in arr.enumerated() {
            if item == 0 {
                if (index + count) < (length - 1){
                    arr.insert(0, at: index + count)
                    count += 1
                }
            }
            if(index + count) >= length{
                arr.remove(at: length)
            }
        }
    }
}

四、总结:

这道题卡了好久,官方解答要好好参悟下

本题的难点在于“原地”更改,即只允许使用O(1)额外空间,并且需要在给定的数组上直接做出修改。

如果从左到右按顺序处理,必然需要额外空间记录0后面的数字,就无法达到原地的要求。 因此我们考虑从后往前写,反正后面多余的数字直接被覆盖,而前面的数字还在原来的位置。

范文参考:

利用左右双指针确定截断位置,再依次进行原地修改 - 复写零 - 力扣(LeetCode)

【小黑刷题】额外数组 / 双指针 倒序填充,可能是我写的最认真的一次题解 - 复写零 - 力扣(LeetCode)