# 题目描述
对数组执行操作
给你一个下标从0
开始的数组 nums
,数组大小为n
,且由 非负 整数组成。
你需要对数组执行n - 1
步操作,其中第 i
步操作(从 0
开始计数)要求对nums
中第i
个元素执行下述指令:
- 如果
nums[i] == nums[i + 1]
,则nums[i]
的值变成原来的2
倍,nums[i + 1]
的值变成0
。否则,跳过这步操作。
在执行完 全部 操作后,将所有 0
移动 到数组的 末尾 。
- 例如,数组
[1,0,2,0,0,1]
将所有0
移动到末尾后变为[1,2,1,0,0,0]
。 返回结果数组。
注意 操作应当 依次有序 执行,而不是一次性全部执行。
提示:
2 <= nums.length <= 2000
0 <= nums[i] <= 1000
# 测试用例
用例1:
- 输入:
nums = [1,2,2,1,1,0]
- 输出:
[1,4,2,0,0,0]
解释
i = 0
:nums[0]
和nums[1]
不相等,跳过这步操作。i = 1
:nums[1]
和nums[2]
相等,nums[1]
的值变成原来的2
倍,nums[2]
的值变成 0 。数组变成[1,4,0,1,1,0]
。i = 2
:nums[2]
和nums[3]
不相等,所以跳过这步操作。i = 3
:nums[3]
和nums[4]
相等,nums[3]
的值变成原来的2
倍,nums[4]
的值变成0
。数组变成[1,4,0,2,0,0]
。i = 4
:nums[4]
和nums[5]
相等,nums[4]
的值变成原来的2
倍,nums[5]
的值变成 0 。数组变成[1,4,0,2,0,0]
。 执行完所有操作后,将 0 全部移动到数组末尾,得到结果数组[1,4,2,0,0,0]
。
用例2:
- 输入:
nums = [0,1]
- 输出:
[1,0]
- 解释:无法执行任何操作,只需要将
0
移动到末尾。
# 思路
原地操作实现,不额外开辟空间
# 代码实现
/**
* @param {number[]} nums
* @return {number[]}
*/
// 输入
var __readline = require("readline-sync");
__readline.setDefaultOptions({prompt: ""})
var readline = __readline.prompt;
console.log("请输入nums: ");
const nums = readline().split(" ").map(Number);
var applyOperations = function(nums) {
// 先执行n- 1次操作
// nums[i] == nums[i + 1] ——> nums[i] = nums[i] * 2; nums[i + 1] = 0
// 执行完n-1之后,将0移动到数组末尾
// 原地操作
// n - 1歩操作
// 遍历到n - 1即可
for(let i = 0; i < nums.length - 1; i ++){
if(nums[i] == nums[i + 1]){
nums[i] = nums[i] * 2;
nums[i + 1] = 0;
}
}
// 移动0
// 快慢指针
for(let fast = 0, slow = 0; fast < nums.length; fast ++){
// fast 找不为0的,然后跟slow交换,slow的位置是0的位置
// fast为0,slow就不移动,保持slow指向0
if(nums[fast] != 0){
let temp = nums[slow];
nums[slow] = nums[fast];
nums[fast] = temp;
slow ++;
}
}
return nums;
};
const res = applyOperations(nums);
console.log("结果为: ", res);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55