# 题目描述

对数组执行操作

给你一个下标从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