您的位置:首页 > 其它

LeetCode 405 Convert a Number to Hexadecimal

2017-07-31 20:38 375 查看
题目:

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"

题目链接
题意:

给一个int的整型数,需要将其转化为16进制表示的字符串,要求负数用补码来表示。给出了四点注意事项:

所有字母a-f全部小写。
不允许前置0,除非值为0.
所给的数保证在32位int的范围内。
不得使用库函数来转换进制。
补码的 有关概念,百科给出其特点为:

一个负整数或原码与其补数相加,和为模。
对一个整数的补码再求补码,等于该证书本身。
补码的正零与负零表式方法相同。
第一次写的时候采用特点一的思路,拿到num,对其判断是否为负,假如为负,则用ffffffff+1减去该数,注意这里ffffffff应为unsign,并且+1的位置应在减去abs(num)之后。

代码如下:
class Solution {
public:
string totoHex(unsigned num) {  // 将unsign转化为hex
char HEX[] = "0123456789abcdef";

9849
string ans;
while (num) {
ans.push_back(HEX[num % 16]);
num /= 16;
}
reverse(ans.begin(), ans.end());
return ans;
}

string toHex(int num) {
unsigned t = num;
if (!num) return "0";
else if (num < 0) {
unsigned temp = 4294967295;
t = temp - abs(num) + 1;
}
return totoHex(t);
}
};


写完之后立刻意识到,int的负数表示其实在unsigned里就是模减去绝对值,所以直接对num进行强制转换,再进行处理,得到第二种写法:

class Solution {
public:

string totoHex(unsigned num) {
char HEX[] = "0123456789abcdef";
string ans;
while (num) {
ans.push_back(HEX[num % 16]);
num /= 16;
}
reverse(ans.begin(), ans.end());
return ans;
}
string toHex(unsigned num) {
return num ? totoHex(num) : "0";
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: