返回

前端算法必刷题系列[82]-复写零

前端

大家晚上好,我是前端早早鸟,今天为大家带来的是前端算法必刷题系列的第82题。

今天这题的难度不大,我们来轻松一下。题目是leetcode的简单题151. 复写零(duplicate-zeros)。题目链接:leetcode传送门

题目

给你一个长度为 n 的整数数组 arr,请你将数组中的每个元素向右移动一个位置,并将 n 的值变成 0。请不要使用任何临时数组。

你能在 O(1) 的时间复杂度和 O(1) 的空间复杂度下完成吗?

示例 1:

输入:arr = [1,0,2,3,0,4,5,0]
输出:[0,1,0,2,3,0,0,4]
解释:
向右旋转 1 步: [0,1,2,3,0,4,5,0]
向右旋转 2 步: [0,0,1,2,3,0,4,5]
向右旋转 3 步: [0,0,0,1,2,3,4,5]

示例 2:

输入:arr = [1,2,3]
输出:[0,1,2]
解释:
向右旋转 1 步: [1,2,3]
向右旋转 2 步: [2,3,0]
向右旋转 3 步: [3,0,0]

提示:

  • 1 <= n <= 10^4
  • 0 <= arr[i] <= 9

解题思路

这道题的解法非常简单,我们可以从后往前遍历数组,遇到0的时候,将其复制到下一个元素,然后将下一个元素复制到下下一个元素,以此类推。这样,我们就实现了将每个元素向右移动一个位置,并将 n 的值变成 0。

代码实现

/**
 * 复写零
 * @param {number[]} arr
 * @return {void} Do not return anything, modify arr in-place instead.
 */
const duplicateZeros = (arr) => {
  for (let i = arr.length - 1; i >= 0; i--) {
    if (arr[i] === 0) {
      for (let j = arr.length - 1; j > i; j--) {
        arr[j] = arr[j - 1];
      }
      arr[i + 1] = 0;
    }
  }
};

复杂度分析

  • 时间复杂度:O(n^2),其中n是数组的长度。这是因为我们从后往前遍历数组,对于每个元素,我们需要将其复制到下一个元素,然后将下一个元素复制到下下一个元素,以此类推。这样,对于每个元素,我们需要进行n次复制操作,因此总的时间复杂度是O(n^2)。
  • 空间复杂度:O(1)。这是因为我们没有使用任何临时数组,因此空间复杂度是O(1)。

总结

这道题的难度不大,但考查了我们对数组操作的熟练程度。这道题的解法非常简单,我们可以从后往前遍历数组,遇到0的时候,将其复制到下一个元素,然后将下一个元素复制到下下一个元素,以此类推。这样,我们就实现了将每个元素向右移动一个位置,并将 n 的值变成 0。

希望这篇文章对您有所帮助。如果您有