405. 数字转换为十六进制数
题目描述
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
答案字符串中的所有字母都应该是小写字符,并且除了 0 本身之外,答案中不应该有任何前置零。
注意: 不允许使用任何由库提供的将数字直接转换或格式化为十六进制的方法来解决这个问题。
示例 1:
输入:num = 26 输出:"1a"
示例 2:
输入:num = -1 输出:"ffffffff"
提示:
-231 <= num <= 231 - 1
解法
方法一
思考
补码 \(32\) 位整数转十六进制,负数亦按位解释。逐位模拟十进制转码需要处理符号,不如直接按 \(4\) 位一组取出。
从高到低共 \(8\) 组,每组与 \(0\text{xF}\) 得到 \(0\)–\(15\),再映射到字符表。跳过尚未写出的前导零;\(0\) 单独返回。
从高位开始扫描,才能在不反转缓冲区的前提下丢掉前导零。
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
方法二
思考
方法一已经按 \(4\) 位分组。方法二用算术把 \(0\)–\(9\)、\(10\)–\(15\) 转成字符,不再依赖字符表,逻辑相同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |