1.题目
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.
给一个32位整数,求16进制表示。负数用补码。
2.分析
一开始挺傻的,老老实实按16进制转换来做,负数还求了反码+1.
然而!!错了,因为-2147483648求反码的时候会溢出。因为正数最大表示为2147483647。不过这个问题后来也可以通过将int转换为long long来解决。
偷瞄了solution,原来别人都是用位运算来做的。唉,刷了这么久的题也没学会套路。
就想字符串一类的题,每次都老老实实遍历if else一大堆,到头来一看solution,人家一行正则表达式就搞定了。还是得长点心啊。
3.代码
正解。别想着自己转换进制了,数在计算机里本来就是按二进制存的。多用位运算。
string toHex(int n) {
if (n == 0)
return "0";
string HEX = "0123456789abcdef";
vector<char> result;
int count = 0;
while (n && count++ < 8) {
result.push_back(HEX[n & 0xf]);
n >>= 4;
}
return string(result.rbegin(), result.rend());
我的挫挫的解
class Solution {
public:
string toHex(int n) {
long long num=n;
if (num == 0)
return "0";
vector<char> hex;
vector<int> neg;
string match= "0123456789abcdef";
bool sign = num > 0 ? true : false;
num = num > 0 ? num : -num;
while (num > 0) {
if(sign)//正数,原码
hex.push_back(match[num % 16]);
else//负数,反码
neg.push_back(15-num % 16);
num /= 16;
}
if (!sign)//反码+1
{
for (int i = neg.size(); i < 8; i++) {
neg.push_back(15);
}
int carry = 1;
for (int i = 0; i < neg.size(); i++) {
carry = neg[i] + carry;
hex.push_back(match[carry % 16]);
carry = carry / 16;
}
}
return string(hex.rbegin(), hex.rend());
}
};