Leetcode每日一题 ——1089. 复写零

2026-04-11 11:301阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

1089. 复写零 - 力扣(LeetCode)
思路

  1. 判断最后被写入的位置:通过双指针cur(读)和 dest(写)向后扫描,模拟复写过程,确定最后一个被保留的元素位置。
  2. 处理越界:当最后一个 0 触发了越界(dest == n),则在末尾手动补 0,并收缩指针,防止数组越界。
  3. 逆向填充:从后往前将元素搬运至目标位。从后往前是核心,它确保了在覆盖旧数据前,该数据已完成备份,从而实现 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)
思路

  1. 判断最后被写入的位置:通过双指针cur(读)和 dest(写)向后扫描,模拟复写过程,确定最后一个被保留的元素位置。
  2. 处理越界:当最后一个 0 触发了越界(dest == n),则在末尾手动补 0,并收缩指针,防止数组越界。
  3. 逆向填充:从后往前将元素搬运至目标位。从后往前是核心,它确保了在覆盖旧数据前,该数据已完成备份,从而实现 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--; } } } } 网友解答:


--【壹】--:

每日一题