Easy
题目描述
给定一个整数 n。
返回 n² 的十六进制表示和 n³ 的三十六进制表示的拼接结果。
十六进制数是一个 16 进制数字系统,使用数字 0-9 和大写字母 A-F 来表示 0 到 15 的值。
三十六进制数是一个 36 进制数字系统,使用数字 0-9 和大写字母 A-Z 来表示 0 到 35 的值。
示例 1:
输入:n = 13
输出:"A91P1"
解释:
n² = 13 * 13 = 169。转换为十六进制:(10 * 16) + 9 = 169,对应 "A9"。
n³ = 13 * 13 * 13 = 2197。转换为三十六进制:(1 * 36²) + (25 * 36) + 1 = 2197,对应 "1P1"。
拼接两个结果得到 "A9" + "1P1" = "A91P1"。
示例 2:
输入:n = 36
输出:"5101000"
解释:
n² = 36 * 36 = 1296。转换为十六进制:(5 * 16²) + (1 * 16) + 0 = 1296,对应 "510"。
n³ = 36 * 36 * 36 = 46656。转换为三十六进制:(1 * 36³) + (0 * 36²) + (0 * 36) + 0 = 46656,对应 "1000"。
拼接两个结果得到 "510" + "1000" = "5101000"。
约束:
1 <= n <= 1000
提示:
- 实现一个函数
toBase(x, b)将整数 x 转换为 b 进制的字符串表示,需要时使用数字 0-9 和字母 A-Z。 - 按描述模拟即可。
解题思路
这道题的核心是实现进制转换函数,然后分别计算 n² 的十六进制和 n³ 的三十六进制表示。
解题思路:
进制转换算法:对于将数字 x 转换为 b 进制,我们使用经典的除法取余法:
- 重复执行:
x % b得到当前位的数字,x //= b为下一轮做准备 - 将余数映射到对应字符:0-9 直接转为字符,10-35 转为 A-Z
- 由于我们是从低位开始计算,最后需要反转字符串
- 重复执行:
字符映射:对于 0-35 的数字,我们可以用一个字符串 “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ” 来映射,或者用条件判断:小于10直接加'0’,否则减10后加’A’。
主要步骤:
- 计算 n²,转换为 16 进制
- 计算 n³,转换为 36 进制
- 拼接两个结果
实现要点:
- 处理 x = 0 的特殊情况
- 确保字符映射正确(0-9 → ‘0’-‘9’,10-35 → ‘A’-‘Z’)
- 注意字符串需要反转(因为我们从低位开始计算)
代码实现
class Solution {
public:
string concatHex36(int n) {
return toBase(n * n, 16) + toBase(n * n * n, 36);
}
private:
string toBase(int x, int base) {
if (x == 0) return "0";
string result = "";
while (x > 0) {
int digit = x % base;
if (digit < 10) {
result += char('0' + digit);
} else {
result += char('A' + digit - 10);
}
x /= base;
}
reverse(result.begin(), result.end());
return result;
}
};
class Solution:
def concatHex36(self, n: int) -> str:
return self.toBase(n * n, 16) + self.toBase(n * n * n, 36)
def toBase(self, x: int, base: int) -> str:
if x == 0:
return "0"
result = ""
while x > 0:
digit = x % base
if digit < 10:
result += str(digit)
else:
result += chr(ord('A') + digit - 10)
x //= base
return result[::-1]
public class Solution {
public string ConcatHex36(int n) {
return ToBase(n * n, 16) + ToBase(n * n * n, 36);
}
private string ToBase(int x, int baseNum) {
if (x == 0) return "0";
StringBuilder result = new StringBuilder();
while (x > 0) {
int digit = x % baseNum;
if (digit < 10) {
result.Append((char)('0' + digit));
} else {
result.Append((char)('A' + digit - 10));
}
x /= baseNum;
}
char[] chars = result.ToString().ToCharArray();
Array.Reverse(chars);
return new string(chars);
}
}
/**
* @param {number} n
* @return {string}
*/
var concatHex36 = function(n) {
const n2 = n * n;
const n3 = n2 * n;
const hex = n2.toString(16).toUpperCase();
const hex36 = n3.toString(36).toUpperCase();
return hex + hex36;
};
复杂度分析
| 复杂度类型 | 复杂度 |
|---|---|
| 时间复杂度 | O(log n) |
| 空间复杂度 | O(log n) |
说明:
- 时间复杂度:进制转换的时间复杂度取决于转换后的位数,对于 16 进制转换 n²,位数约为 O(log₁₆(n²)) = O(log n),对于 36 进制转换 n³ 同理
- 空间复杂度:主要用于存储转换结果的字符串,长度也是 O(log n)