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 0s. 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 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

https://discuss.leetcode.com/topic/60412/concise-10-line-c-solution-for-both-positive-and-negative-input

 

LeetCode All in One 题目讲解汇总(持续更新中...)

查看原文