返回
前端算法必刷题系列[82]-复写零
前端
2023-09-16 13:10:20
大家晚上好,我是前端早早鸟,今天为大家带来的是前端算法必刷题系列的第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。
希望这篇文章对您有所帮助。如果您有