对数组执行操作
难度:
标签:
题目描述
代码结果
运行时间: 22 ms, 内存: 16.2 MB
/*
* 思路:
* 1. 使用流操作对数组进行处理。
* 2. 首先对数组进行遍历,如果相邻两个元素相等,按规则修改数组。
* 3. 最后通过流将非零元素提取出来,并在末尾补充0。
*/
import java.util.Arrays;
import java.util.stream.Collectors;
public int[] processArrayStream(int[] nums) {
int n = nums.length;
for (int i = 0; i < n - 1; i++) {
if (nums[i] == nums[i + 1]) {
nums[i] *= 2;
nums[i + 1] = 0;
}
}
return Arrays.stream(nums)
.filter(num -> num != 0)
.boxed()
.collect(Collectors.toList())
.stream()
.flatMap(num -> Arrays.stream(new int[]{num, 0}).limit(num == 0 ? 0 : 1))
.mapToInt(i -> i)
.toArray();
}
解释
方法:
首先遍历数组 `nums`,对于每个元素 `nums[i]`,如果它和下一个元素 `nums[i+1]` 相等,则将 `nums[i]` 更新为其两倍,并将 `nums[i+1]` 设置为0。接着,再次遍历数组,将非零元素放入列表 `ans1`,将零元素放入列表 `ans2`。这样做的目的是为了将所有非零元素保持原有顺序,而将零元素移动到数组的末尾。最后,返回 `ans1` 和 `ans2` 的合并结果,即为最终数组。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在算法中,为什么选择在操作完成后再分别处理零和非零元素,而不是在进行倍增操作时直接调整元素的位置?
▷🦆
如果数组中存在多个连续的相同值,例如 [2,2,2,2],算法如何确保正确地处理这种情况?会不会存在遗漏或重复倍增的问题?
▷🦆
为什么在处理完 `nums[i]` 和 `nums[i+1]` 后,没有跳过已经设为0的 `nums[i+1]` 在下一次循环时再次检查?
▷🦆
在返回结果时,合并 `ans1` 和 `ans2` 的操作是否会影响数组中元素的原始相对顺序,尤其是在存在多个0的情况下?
▷