主题切换
LeetCode 每日一题笔记
0. 前言
- 日期:2026.06.13
- 题目:3838. 带权单词映射
- 难度:简单
- 标签:字符串、数组、模拟
1. 题目理解
问题描述 给定字符串数组 words 和长度26的权重数组 weights,规则:
- 单词权重 = 单词所有字符对应的权重之和;
- 将总和对26取模,映射规则:
0→'z',1→'y' … 25→'a'; - 每个单词映射为单个字符,按单词顺序拼接所有映射字符作为最终结果字符串。
示例
输入: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. 解题思路
核心观察
- 字符
c对应权重下标为c - 'a'; - 映射字符公式:
(char)('z' - sum % 26); - 使用
StringBuilder拼接字符,避免频繁字符串创建带来的性能损耗。
算法步骤
- 创建
StringBuilder存放结果; - 遍历每个单词,累加单词所有字符的权重;
- 总和模26后按规则转为目标字符,追加到缓冲区;
- 遍历完成,返回拼接后的字符串。
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. 复杂度分析
- 原始版本 时间:
,M为所有单词字符总数;多方法拆分、多余取模、打印语句增加常数开销 空间: ,N为单词数量, StringBuilder存储结果 - 优化版本 时间:
,总遍历次数不变;删除多余辅助方法、打印语句,无冗余运算,常数耗时更低 空间: ,仅结果缓冲区;预分配 StringBuilder容量减少内存扩容
6. 总结
- 核心:字符权重求和 + 模26逆序字母映射,纯模拟题;
- 优化亮点:取消冗余辅助函数、简化循环写法、预分配缓冲区容量,无多余if分支;
- 关键公式:
'z' - (总和 % 26)完成数字到字母的逆序映射。