3379. Transformed Array

練習日期:2026-02-05

難度:Easy

類型:Array、Simulation

📘 題目敘述

給你一個整數陣列 nums,它表示一個循環陣列。請你依照規則建立一個大小相同的新陣列 result

  • 如果 nums[i] > 0:從索引 i 出發向右移動 nums[i] 步,result[i] 為停下位置的值。
  • 如果 nums[i] < 0:從索引 i 出發向左移動 abs(nums[i]) 步,result[i] 為停下位置的值。
  • 如果 nums[i] == 0result[i] = nums[i]

因為 nums 是循環陣列,所以超過最後一個元素會回到開頭,在第一個元素之前則會回到結尾。

條件限制

  • 1 <= nums.length <= 100
  • -100 <= nums[i] <= 100

🧠 解題思路

這題的核心是算出每個索引 i 最後會落在哪個索引 pos,再把 nums[pos] 放到答案中。

不論往左或往右,都可以統一成:pos = i + nums[i],再透過取模把結果壓回合法範圍。

由於 C++ 對負數取模可能得到負值,所以使用常見寫法:

pos = ((i + nums[i]) % n + n) % n

🧩 所有變數

  • nums:輸入陣列(循環陣列)。
  • ans:要回傳的新陣列。
  • pos:第 i 格移動後的落點索引。
  • n:陣列長度。

🪜 主要流程步驟

1. 取得陣列長度並準備答案陣列

  • n = nums.size()
  • 建立空陣列 ans

2. 逐一處理每個索引 i 的落點

對每個 i = 0 ... n-1

  • 計算落點索引:pos = ((i + nums[i]) % n + n) % n
  • 把落點值放進答案:ans.push_back(nums[pos])

3. 回傳答案

  • return ans

💻 程式碼實作

class Solution {
public:
    vector<int> constructTransformedArray(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans;
        for (int i = 0; i < n; i++) {
            int pos = ((i + nums[i]) % n + n) % n;
            ans.push_back(nums[pos]);
        }
        return ans;
    }
};

https://leetcode.com/problems/transformed-array/

作者: scottnick
撰寫日期: 2026-02-05
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/3379-transformed-array.html