[leetcode]: 405. Convert a Number to Hexadecimal

小咪咪 2022-06-15 01:57 272阅读 0赞

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.代码

正解。别想着自己转换进制了,数在计算机里本来就是按二进制存的。多用位运算。

  1. string toHex(int n) {
  2. if (n == 0)
  3. return "0";
  4. string HEX = "0123456789abcdef";
  5. vector<char> result;
  6. int count = 0;
  7. while (n && count++ < 8) {
  8. result.push_back(HEX[n & 0xf]);
  9. n >>= 4;
  10. }
  11. return string(result.rbegin(), result.rend());

我的挫挫的解

  1. class Solution {
  2. public:
  3. string toHex(int n) {
  4. long long num=n;
  5. if (num == 0)
  6. return "0";
  7. vector<char> hex;
  8. vector<int> neg;
  9. string match= "0123456789abcdef";
  10. bool sign = num > 0 ? true : false;
  11. num = num > 0 ? num : -num;
  12. while (num > 0) {
  13. if(sign)//正数,原码
  14. hex.push_back(match[num % 16]);
  15. else//负数,反码
  16. neg.push_back(15-num % 16);
  17. num /= 16;
  18. }
  19. if (!sign)//反码+1
  20. {
  21. for (int i = neg.size(); i < 8; i++) {
  22. neg.push_back(15);
  23. }
  24. int carry = 1;
  25. for (int i = 0; i < neg.size(); i++) {
  26. carry = neg[i] + carry;
  27. hex.push_back(match[carry % 16]);
  28. carry = carry / 16;
  29. }
  30. }
  31. return string(hex.rbegin(), hex.rend());
  32. }
  33. };

发表评论

表情:
评论列表 (有 0 条评论,272人围观)

还没有评论,来说两句吧...

相关阅读