Leetcode每日一题 ——1089. 复写零
- 内容介绍
- 文章标签
- 相关推荐
1089. 复写零 - 力扣(LeetCode)
思路
- 判断最后被写入的位置:通过双指针cur(读)和 dest(写)向后扫描,模拟复写过程,确定最后一个被保留的元素位置。
- 处理越界:当最后一个 0 触发了越界(dest == n),则在末尾手动补 0,并收缩指针,防止数组越界。
- 逆向填充:从后往前将元素搬运至目标位。从后往前是核心,它确保了在覆盖旧数据前,该数据已完成备份,从而实现 O(1) 空间下的原地修改。
代码
class Solution {
public void duplicateZeros(int[] arr) {
int cur = 0, dest = -1, n = arr.length;
// 1. 先找到最后⼀个需要复写的数
while (cur < n) {
if (arr[cur] == 0) dest += 2;
else dest += 1;
if (dest >= n - 1) break;
cur++;
}
// 2. 处理⼀下边界情况
if (dest == n) {
arr[n - 1] = 0;
cur--;
dest -= 2;
}
// 3. 从后向前完成复写操作
while (cur >= 0) {
if (arr[cur] != 0) arr[dest--] = arr[cur--];
else {
arr[dest--] = 0;
arr[dest--] = 0;
cur--;
}
}
}
}
网友解答:
--【壹】--:
每日一题
1089. 复写零 - 力扣(LeetCode)
思路
- 判断最后被写入的位置:通过双指针cur(读)和 dest(写)向后扫描,模拟复写过程,确定最后一个被保留的元素位置。
- 处理越界:当最后一个 0 触发了越界(dest == n),则在末尾手动补 0,并收缩指针,防止数组越界。
- 逆向填充:从后往前将元素搬运至目标位。从后往前是核心,它确保了在覆盖旧数据前,该数据已完成备份,从而实现 O(1) 空间下的原地修改。
代码
class Solution {
public void duplicateZeros(int[] arr) {
int cur = 0, dest = -1, n = arr.length;
// 1. 先找到最后⼀个需要复写的数
while (cur < n) {
if (arr[cur] == 0) dest += 2;
else dest += 1;
if (dest >= n - 1) break;
cur++;
}
// 2. 处理⼀下边界情况
if (dest == n) {
arr[n - 1] = 0;
cur--;
dest -= 2;
}
// 3. 从后向前完成复写操作
while (cur >= 0) {
if (arr[cur] != 0) arr[dest--] = arr[cur--];
else {
arr[dest--] = 0;
arr[dest--] = 0;
cur--;
}
}
}
}
网友解答:
--【壹】--:
每日一题

