Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two’s complement method is used.
Note:
- All letters in hexadecimal (
a-f
) must be in lowercase. - The hexadecimal string must not contain extra leading
0
s. If the number is zero, it is represented by a single zero character'0'
; otherwise, the first character in the hexadecimal string will not be the zero character. - The given number is guaranteed to fit within the range of a 32-bit signed integer.
- You must not use any method provided by the library which converts/formats the number to hex directly.
Example 1:
Input: 26 Output: "1a"
Example 2:
Input: -1 Output: "ffffffff"
这道题给了我们一个数字,让我们转化为十六进制,抛开题目,我们应该都会把一个十进制数转为十六进制数,比如50,转为十六进制数,我们先对50除以16,商3余2,那么转为十六进制数就是32。所以我们就按照这个思路来写代码,由于输入数字的大小限制为int型,我们对于负数的处理方法是用其补码来运算,那么数字范围就是0到UINT_MAX,即为16^8-1,那么最高位就是16^7,我们首先除以这个数字,如果商大于等于10,我们用字母代替,否则就是用数字代替,然后对其余数进行同样的处理,一直到当前数字为0停止,最后我们还要补齐末尾的0,方法根据n的值,比-1大多少就补多少个0。由于题目中说明了最高位不能有多余的0,所以我们将起始0移除,如果res为空了,我们就返回0即可,参见代码如下:
解法一:
class Solution { public: string toHex(int num) { string res = ""; vector<string> v{"a","b","c","d","e","f"}; int n = 7; unsigned int x = num; if (num < 0) x = UINT_MAX + num + 1; while (x > 0) { int t = pow(16, n); int d = x / t; if (d >= 10) res += v[d - 10]; else if (d >= 0) res += to_string(d); x %= t; --n; } while (n-- >= 0) res += to_string(0); while (!res.empty() && res[0] == '0') res.erase(res.begin()); return res.empty() ? "0" : res; } };
上述方法稍稍复杂一些,我们来看一种更简洁的方法,我们采取位操作的思路,每次取出最右边四位,如果其大于等于10,找到对应的字母加入结果,反之则将对应的数字加入结果,然后num像右平移四位,循环停止的条件是num为0,或者是已经循环了7次,参见代码如下:
解法二:
class Solution { public: string toHex(int num) { string res = ""; for (int i = 0; num && i < 8; ++i) { int t = num & 0xf; if (t >= 10) res = char('a' + t - 10) + res; else res = char('0' + t) + res; num >>= 4; } return res.empty() ? "0" : res; } };
下面这种写法更加简洁一些,虽然思路跟解法二并没有什么区别,但是我们把要转换的十六进制的数字字母都放在一个字符串中,按位置直接取就可以了,参见代码如下:
解法三:
class Solution { public: string toHex(int num) { string res = "", str = "0123456789abcdef"; int cnt = 0; while (num != 0 && cnt++ < 8) { res = str[(num & 0xf)] + res; num >>= 4; } return res.empty() ? "0" : res; } };
参考资料:
https://discuss.leetcode.com/topic/60431/concise-c-solution
https://discuss.leetcode.com/topic/60365/simple-java-solution-with-comment