LeetCode 405 Convert a Number to Hexadecimal

题目:

Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two’s complement method is used.

Note:

  1. All letters in hexadecimal (a-f) must be in lowercase.
  2. 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.
  3. The given number is guaranteed to fit within the range of a 32-bit signed integer.
  4. 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进制表示的字符串,要求负数用补码来表示。给出了四点注意事项:

  1. 所有字母a-f全部小写。
  2. 不允许前置0,除非值为0.
  3. 所给的数保证在32位int的范围内。
  4. 不得使用库函数来转换进制。
补码的 有关概念, 百科给出其特点为:
  1. 一个负整数或原码与其补数相加,和为模。
  2. 对一个整数的补码再求补码,等于该证书本身。
  3. 补码的正零与负零表式方法相同。
第一次写的时候采用特点一的思路,拿到num,对其判断是否为负,假如为负,则用ffffffff+1减去该数,注意这里ffffffff应为unsign,并且+1的位置应在减去abs(num)之后。
代码如下:
class Solution {
public:
    string totoHex(unsigned num) {  // 将unsign转化为hex
        char HEX[] = "0123456789abcdef";
        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";
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值