数字转换为十六进制数
难度:
标签:
题目描述
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
注意:
- 十六进制中所有字母(
a-f
)都必须是小写。 - 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符
'0'
来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 - 给定的数确保在32位有符号整数范围内。
- 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
示例 1:
输入: 26 输出: "1a"
示例 2:
输入: -1 输出: "ffffffff"
代码结果
运行时间: 20 ms, 内存: 0.0 MB
/*
* 题目思路:
* 1. 使用字符数组存储十六进制字符'0'到'f'。
* 2. 特殊处理数字为0的情况。
* 3. 对负数进行补码运算。
* 4. 使用流的方式处理每一位的转换,最后拼接成字符串。
*/
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public String toHex(int num) {
if (num == 0) return "0";
char[] hexChars = "0123456789abcdef".toCharArray();
StringBuilder hexString = new StringBuilder();
int n = num;
while (n != 0) {
int index = n & 0xF;
hexString.append(hexChars[index]);
n >>>= 4;
}
return hexString.reverse().toString();
}
}
解释
方法:
这个题解使用了除以16取余数的方法来将十进制数转换为十六进制数。首先,如果输入的数是负数,那么将其转换为补码形式。然后,不断地将数除以16,并将余数映射到十六进制字符上,直到商为0。最后,将得到的字符序列逆序拼接起来即为结果。
时间复杂度:
O(1)
空间复杂度:
O(1)
代码细节讲解
🦆
在算法中,对于负数的处理是通过加上 2^32 来转换为补码,这个方法是否适用于所有的32位整数,包括极端情况比如最小的整数 -2^31?
▷🦆
题解中提到的方法是通过循环除以16并取余数来转化为十六进制,那么在循环条件为 `while num` 时,为什么不需要考虑数字为负的情况?
▷🦆
题解提到,如果栈为空则直接返回 '0',这种情况是否只适用于输入数字为0的情况,还是还有其他可能性?
▷🦆
算法通过将数字不断除以16并取余数计算十六进制数,那么在数字非常大(接近32位整数的最大值)或非常小(接近32位整数的最小值)的情况下,这种方法的效率如何?
▷