📘 題目敘述
給你一個整數陣列 nums,它表示一個循環陣列。請你依照規則建立一個大小相同的新陣列 result:
- 如果
nums[i] > 0:從索引i出發向右移動nums[i]步,result[i]為停下位置的值。 - 如果
nums[i] < 0:從索引i出發向左移動abs(nums[i])步,result[i]為停下位置的值。 - 如果
nums[i] == 0:result[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/