3819. Rotate Non-Negative Elements

練習日期:2026-01-25

難度:Medium

類型:Array、Simulation、Weekly Contest 486

📘 題目敘述

給你一個整數陣列 nums 與一個整數 k

請你只針對陣列中的非負數元素(>= 0)做向左循環旋轉 k 個位置。

  • 所有負數元素必須保持原本位置不動
  • 旋轉後只填回原本是非負數的位置

條件限制

  • 1 <= nums.length <= 10^5
  • -10^5 <= nums[i] <= 10^5
  • 0 <= 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/

作者: scottnick
撰寫日期: 2026-01-25
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/3819-rotate-non-negative-elements.html