Skip to content

LeetCode 每日一题笔记 ​

0. 前言 ​

  • 日期:2026.06.13
  • 题目:3838. 带权单词映射
  • 难度:简单
  • 标签:字符串、数组、模拟

1. 题目理解 ​

问题描述 给定字符串数组 words 和长度26的权重数组 weights,规则:

  1. 单词权重 = 单词所有字符对应的权重之和;
  2. 将总和对26取模,映射规则:0→'z',1→'y' … 25→'a';
  3. 每个单词映射为单个字符,按单词顺序拼接所有映射字符作为最终结果字符串。

示例

输入:words = ["abcd","def","xyz"], weights = [5,3,12,14,1,2,3,2,10,6,6,9,7,8,7,10,8,9,6,9,9,8,3,7,7,2] 输出:"rij"

2. 解题思路 ​

核心观察 ​

  1. 字符c对应权重下标为 c - 'a';
  2. 映射字符公式:(char)('z' - sum % 26);
  3. 使用StringBuilder拼接字符,避免频繁字符串创建带来的性能损耗。

算法步骤 ​

  1. 创建StringBuilder存放结果;
  2. 遍历每个单词,累加单词所有字符的权重;
  3. 总和模26后按规则转为目标字符,追加到缓冲区;
  4. 遍历完成,返回拼接后的字符串。

3. 代码实现 ​

java
package lc3000_lc3099.lc3838;

public class Solution {
    public String mapWordWeights(String[] words, int[] weights) {
        int length = words.length;
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < length ; i++) {
            String s = words[i];
            int sum = 0;
            for (int j = 0; j < s.length() ; j++) {
                sum += method2(s.charAt(j),weights);
                sum %= 26;
            }
            stringBuilder.append(method1(sum));
        }
        return stringBuilder.toString();
    }

    private int method2(char c,int[] weights) {
        return weights[25+c-'z'];
    }

    private char method1(int sum) {
        return  (char) ('z' - sum);
    }
}

4. 代码优化说明 ​

java
class Solution {
public String mapWordWeights(String[] words, int[] weights) {
    // 初始化缓冲区,预估容量减少扩容次数
    StringBuilder ans = new StringBuilder(words.length);
    // 增强for遍历单词,简化下标循环
    for (String word : words) {
        int s = 0;
        // 累加当前单词所有字符权重
        for (int i = 0; i < word.length(); i++) {
            // 字符转权重下标:c-'a',直接取权重累加
            s += weights[word.charAt(i) - 'a'];
        }
        // 模26后直接计算映射字符并追加
        ans.append((char) ('z' - s % 26));
    }
    return ans.toString();
}
}

5. 复杂度分析 ​

  • 原始版本 时间:O(M),M为所有单词字符总数;多方法拆分、多余取模、打印语句增加常数开销 空间:O(N),N为单词数量,StringBuilder存储结果
  • 优化版本 时间:O(M),总遍历次数不变;删除多余辅助方法、打印语句,无冗余运算,常数耗时更低 空间:O(N),仅结果缓冲区;预分配StringBuilder容量减少内存扩容

6. 总结 ​

  • 核心:字符权重求和 + 模26逆序字母映射,纯模拟题;
  • 优化亮点:取消冗余辅助函数、简化循环写法、预分配缓冲区容量,无多余if分支;
  • 关键公式:'z' - (总和 % 26) 完成数字到字母的逆序映射。

Powered by VitePress 1.6.4 | 持续更新中