[leetcode: Python]405. Convert a Number to Hexadecimal

Title:
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.
Example 1:

Input:
26

Output:
"1a"

Example 2:

Input:
-1

Output:
"ffffffff"

方法一:58ms

class Solution(object):
    def toHex(self, num):
        """
        :type num: int
        :rtype: str
        """
        dict = {10:'a', 11:'b', 12:'c', 13:'d', 14:'e', 15:'f'}
        if num == 0:
            return '0'
        if num < 0:
            num += 2**32
        s = ''
        s1 = []
        if num > 0 and num < 10:
            return str(num)
        elif num >=10 and num < 16:
            return dict[num]
        while num >= 16:
            num, res =divmod(num, 16)
            s1.append(res)
        s1.append(num)
        for i in s1:
            if i < 10:
                s = str(i) + s
            else:
                s = dict[i] + s
        return s

方法二:42ms

class Solution(object):
    def toHex(self, num):
        """
        :type num: int
        :rtype: str
        """
        # def get_hex(m, num):
        #     res = []
        #     while num > 0:
        #         res.append(MAP[num % 16])
        #         num = num / 16
        #     res = ''.join(res[::-1])
        #     return res

        # def reverse(m, r_m, num):
        #     res = []
        #     for n in num:
        #         res.append(m[15 - r_m[n]])
        #     final = ['f'] * 8
        #     for i, r in enumerate(res[::-1]):
        #         final[7-i] = r
        #     return final

        # def add_one_on_last(m, r_m, num):
        #     c = False
        #     if num[7] == 'f':
        #         num[7] = '0'
        #         c = True
        #     else:
        #         num[7] = m[r_m[num[7]] + 1]
        #     copy_num = num
        #     if c:
        #         for i, n in enumerate(copy_num[-2::-1]):
        #             tmp = r_m[n] + 1
        #             if tmp == 16:
        #                 num[6-i] = '0'
        #             else:
        #                 num[6-i] = m[r_m[num[6-i]] + 1]
        #                 break
        #     return num

        # if num == 0:
        #     return '0'
        # MAP = {
        #     i: str(i) for i in range(0,10)
        # }
        # MAP[10] = 'a'
        # MAP[11] = 'b'
        # MAP[12] = 'c'
        # MAP[13] = 'd'
        # MAP[14] = 'e'
        # MAP[15] = 'f'
        # reverse_map = {v: k for k, v in MAP.items()}
        # #print(reverse_map)
        # tmp_num = num if num > 0 else -num
        # res = get_hex(MAP, tmp_num)
        # if num < 0:
        #     #print(res)
        #     res = reverse(MAP, reverse_map, res)
        #     #print(res)
        #     res = add_one_on_last(MAP, reverse_map, res)

        # return ''.join(res)
        if num==0: return '0'
        mp = '0123456789abcdef'  # like a map
        ans = ''
        for i in range(8):
            n = num % 16       # this means num & 1111b
            c = mp[n]          # get the hex char 
            ans = c + ans
            num = num >> 4
        return ans.lstrip('0')  #strip leading zeroes

方法三: 35ms

class Solution(object):
    re = {}
    def toHex(self, num):
        """
        :type num: int
        :rtype: str
        """
        if 0 <= num < 10:
            return str(num)
        if 10 <= num < 16:
            return chr(ord('a') + num - 10)

        if num not in self.re:
            if num < 0:
                self.re[num] = self.toHex(2**32+num)
            else:
                res = num % 16
                val = self.toHex(num/16)
                self.re[num] = val + self.toHex(res)
        return self.re[num]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值