题目描述

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"

解法一

思路

这题是要把十进制数转换为十六进制,并且对于负数是采用补码形式。

那么这题就直接是把数的二进制以十六进制的形式表示出来就好了。即:

26 -> 11010 -> 1a
115 -> 1110011 -> 73
-1 -> 11111111111111111111111111111111 -> ffffffff

即每次处理二进制数的最低4位,得到0-15间的值映射到0123456789abcdef中得到十六进制表示;再将此二进制数向右移动4位,循环处理,直到二进制数为0

Python

class Solution(object):
    def toHex(self, num):
        """
        :type num: int
        :rtype: str
        """
        if num == 0:
            return '0'
        symbols = '0123456789abcdef'
        result = ''
        while num:
            value = num & 0xf
            result += symbols[value]
            num = num >> 4 if num > 0 else (num % 0x100000000) >> 4
        return result[::-1]

Java

public class Solution {
    public String toHex(int num) {
        if (num == 0) {
            return "0";
        }
        String symbols = "0123456789abcdef";
        StringBuilder result = new StringBuilder();
        while (num != 0) {
            int value = num & 0xf;
            result.append(symbols.charAt(value));
            num >>>= 4;
        }
        return result.reverse().toString();
    }
}

C++

class Solution {
public:
    string toHex(int num) {
        if (num == 0) {
            return "0";
        }
        string symbols = "0123456789abcdef";
        string result = "";
        while (num) {
            int value = num & 0xf;
            result += symbols[value];
            num = (int)((unsigned int) num >> 4);
        }
        reverse(result.rbegin(), result.rend());
        return result;
    }
};