📘 題目敘述
給你一個整數陣列 nums 與一個整數 k。
請你只針對陣列中的非負數元素(>= 0)做向左循環旋轉 k 個位置。
- 所有負數元素必須保持原本位置不動
- 旋轉後只填回原本是非負數的位置
條件限制
1 <= nums.length <= 10^5-10^5 <= nums[i] <= 10^50 <= k <= 10^5
🧠 解題思路
把非負數抽出來旋轉,再放回原本非負數的位置即可,負數位置完全不動。
所有變數
n:陣列長度spos:非負數的位置索引snum:非負數的值m:非負數總數k:向左旋轉步數
🪜 主要流程步驟
1. 收集非負數
- 若
nums[i] >= 0,就記錄索引到spos、數值到snum
2. 左旋轉 k
- 對每個非負數位置
spos[j] - 填入
snum[(j + k) % m]
3. 回傳結果
- 負數位置不動,回傳更新後的
nums
💻 程式碼實作
class Solution {
public:
vector<int> rotateElements(vector<int>& nums, int k) {
int n = nums.size();
vector<int> spos;
vector<int> snum;
for (int i = 0; i < n; i++) {
if (nums[i] >= 0) {
spos.push_back(i);
snum.push_back(nums[i]);
}
}
int m = spos.size();
for (int j = 0; j < m; j++) {
nums[spos[j]] = snum[(j + k) % m];
}
return nums;
}
};
🔗 題目連結
https://leetcode.com/problems/rotate-non-negative-elements/