开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
一、题目描述:
给你一个长度固定的整数数组 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
二、思路分析:
- 获取数组长度length;定义count为已循环过的0的个数;
- 遍历数组,找到其中为0的元素,并在它后面(index + count)插入一个0;
- 在新数组长度超过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后面的数字,就无法达到原地的要求。 因此我们考虑从后往前写,反正后面多余的数字直接被覆盖,而前面的数字还在原来的位置。