Q1. Weighted Word Mapping

練習日期:2026-02-14

難度:Easy

類型:Biweekly Contest 176

📘 題目敘述

給你一個字串陣列 words,其中每個字串代表一個只包含小寫英文字母的單字。

你也會拿到一個長度為 26 的整數陣列 weights,其中 weights[i] 代表第 i 個小寫英文字母的權重。

一個單字的權重定義為:它所有字元的權重總和。

對每個單字,把它的權重對 26 取模,並用反向字母順序把結果對應到一個小寫字母(0 -> 'z', 1 -> 'y', ..., 25 -> 'a')。

請回傳一個字串,內容是依序把每個單字對應到的字母串接起來。

條件限制

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 10
  • weights.length == 26
  • 1 <= weights[i] <= 100
  • words[i] 只包含小寫英文字母

🧠 解題思路

這題就是照題目描述做轉換,我的邏輯分成兩段:

第一段先算每個單字的權重。我把字元 c 轉成 0~25 的位置 pos = c - 'a',然後把 weights[pos] 加進總和。

第二段把總和對 26 取模,得到 check。題目規定 check 要用反向字母表映射:

  • 0 要變成 'z'
  • 25 要變成 'a'

所以我用這個轉換式:

mapped = 'a' + (25 - check)

最後把每個單字的 mapped 字元依序加到 ans,回傳 ans

所有變數

  • ans:最後要回傳的結果字串(把每個單字對應到的字母依序串起來)
  • check:某個單字的權重總和(後面會再 mod 26
  • pos:把某個字元轉成 0~25 的索引,用來查 weights

🪜 主要流程步驟

1. 逐個處理 words 裡的單字

我用迴圈把 words 裡每個 s 拿出來,對每個單字都獨立算一次權重並轉成字母。


2. 計算單字權重總和 check

對某個單字 s

  • 先把 check 設成 0
  • 掃過 s 的每個字元
  • 把字元轉成索引 pos = s[i] - 'a'
  • check += weights[pos]

這樣 check 就是這個單字的權重。


3. 權重對 26 取模,得到映射用的數字

題目要的是 weight % 26,所以我做:

check %= 26


4. 用反向字母表把 check 轉成字元並加到答案

反向字母表的規則是 0 -> z ... 25 -> a

所以我用:

ans += (char)(25 - check + 'a')

這樣就把對應字元加進 ans


5. 回傳 ans

所有單字處理完後,ans 就是答案。

⏱️ 複雜度

  • 時間複雜度:O(totalLen)
    totalLen 是所有單字長度總和,因為每個字元只會被掃過一次。
  • 空間複雜度:O(1)(不含輸出字串)
    只用了固定幾個整數變數;輸出 ans 長度是 words.length

💻 程式碼實作

class Solution {
public:
    string mapWordWeights(vector<string>& words, vector<int>& weights) {
        string ans = "";
        for (string s : words) {
            int check = 0;
            for (int i = 0; i < s.size(); i++) {
                int pos = s[i] - 'a';
                check += weights[pos];
            }
            check %= 26;
            ans += (char)(25 - check + 'a');
        }
        return ans;
    }
};

https://leetcode.com/contest/biweekly-contest-176/problems/weighted-word-mapping/

作者:scottnick
撰寫日期:2026-02-14
類別:
原文連結: https://scottnick.github.io/cpp-notes/contests/biweekly-contest-176/q1-weighted-word-mapping.html