LeetCode 补充题 9. 36进制加法
题目描述
给定两个用 36 进制表示的非负整数字符串 num1 和 num2,返回它们之和的 36 进制字符串表示。
36 进制使用字符 '0'-'9' 表示数字 0–9,使用字符 'a'-'z' 表示数字 10–35。
思路分析
解法一:模拟逐位相加(推荐)
核心思路:
- 类比十进制字符串相加,从最低位(字符串末尾)向最高位逐位相加,维护进位
carry。- 字符转数字:
'0'-'9'映射到 0–9,'a'-'z'映射到 10–35。- 数字转字符:0–9 映射回
'0'-'9',10–35 映射回'a'-'z'。- 每一位的结果为
(d1 + d2 + carry) % 36,新进位为(d1 + d2 + carry) / 36。- 双指针分别从两个字符串末尾向前移动,结果逆序构建,最后翻转输出。
复杂度分析:
- 时间复杂度:O(max(m, n)),其中 m、n 分别为两个字符串的长度,需遍历所有位。
- 空间复杂度:O(max(m, n)),用于存储结果字符串。
class Solution {
public String add36Strings(String num1, String num2) {
int i = num1.length() - 1;
int j = num2.length() - 1;
int carry = 0;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0 || carry != 0) {
// 取当前位的数值,指针已越界则取 0
int d1 = i >= 0 ? charToDigit(num1.charAt(i--)) : 0;
int d2 = j >= 0 ? charToDigit(num2.charAt(j--)) : 0;
// 计算当前位之和
int sum = d1 + d2 + carry;
carry = sum / 36;
// 将当前位转换为字符并追加到结果
sb.append(digitToChar(sum % 36));
}
// 逆序得到最终结果
return sb.reverse().toString();
}
/** 将 36 进制字符转换为对应整数值 */
private int charToDigit(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
}
return c - 'a' + 10;
}
/** 将整数值转换为对应的 36 进制字符 */
private char digitToChar(int d) {
if (d < 10) {
return (char) ('0' + d);
}
return (char) ('a' + d - 10);
}
}
func add36Strings(num1 string, num2 string) string {
i, j := len(num1)-1, len(num2)-1
carry := 0
result := []byte{}
for i >= 0 || j >= 0 || carry != 0 {
d1, d2 := 0, 0
// 取当前位的数值,指针已越界则取 0
if i >= 0 {
d1 = charToDigit(num1[i])
i--
}
if j >= 0 {
d2 = charToDigit(num2[j])
j--
}
// 计算当前位之和
sum := d1 + d2 + carry
carry = sum / 36
// 将当前位转换为字符并追加到结果
result = append(result, digitToChar(sum%36))
}
// 逆序得到最终结果
for lo, hi := 0, len(result)-1; lo < hi; lo, hi = lo+1, hi-1 {
result[lo], result[hi] = result[hi], result[lo]
}
return string(result)
}
// charToDigit 将 36 进制字符转换为对应整数值
func charToDigit(c byte) int {
if c >= '0' && c <= '9' {
return int(c - '0')
}
return int(c-'a') + 10
}
// digitToChar 将整数值转换为对应的 36 进制字符
func digitToChar(d int) byte {
if d < 10 {
return byte('0' + d)
}
return byte('a' + d - 10)
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 415. 字符串相加 | 简单 | 字符串 / 进位处理 |
| 67. 二进制求和 | 简单 | 字符串 / 二进制加法 |
| 2. 两数相加 | 中等 | 链表 / 进位处理 |
| 445. 两数相加 II | 中等 | 链表 / 栈 + 进位 |
| 43. 字符串相乘 | 中等 | 字符串 / 逐位相乘 |
| 989. 数组形式的整数加法 | 简单 | 数组 / 进位处理 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!