405. 数字转换为十六进制数

考点

  • 掩码技巧
  • 移位技巧

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
private:
string ans;
char chr[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8'
, '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
public:
string toHex(unsigned int num) {
if (!num) return "0";
while (num) {
ans = chr[num & 0b1111] + ans;
num >>= 4;
}
return ans;
}
};

时间复杂度:\(O\left( k \right)\),在这里\(k\)等于32 / 4 = 8,即32位整数的十六进制位数

空间复杂度:\(O\left( k \right)\),同上

思路

首先将整数从int转换为unsigned int,因为C++当中没有无符号运算符;倘若整数为int类型的负数,右移时会在高位补1

同时题目要求不包含前导零,所以每次循环之前需要判断整数是否为空

整数和掩码1111作与运算取出低四位,并将其倒序保存至字符串后,整数右移四位开启下一轮循环