【LeetCode每日一题】——405.数字转换为十六进制数

一【题目类别】

  • 位运算

二【题目难度】

  • 简单

三【题目编号】

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

四【题目描述】

  • 给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
  • 注意:
    1. 十六进制中所有字母(a-f)都必须是小写。
    2. 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符’0’来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
    3. 给定的数确保在32位有符号整数范围内。
    4. 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

五【题目示例】

  • 示例 1:

    • 输入:26
    • 输出:“1a”
  • 示例 2:

    • 输入:-1
    • 输出:“ffffffff”

六【解题思路】

  • 利用位运算的思想,首先新建一个字符数组保存所有的十六进制字符,用于得到结果数组
  • 然后准备进入循环,当传入参数不为0,并且结果字符串的长度小于8的时候进入循环,传入参数不为0好理解,要求字符串的长度小于8是避免死循环的情况,因为循环内需要右移,如果是负数,按照算术右移的规定,高位补的永远都是1,这样传入参数永远不会等于0,就会陷入死循环
  • 进入循环后,首先利用位运算& 0xf取出传入参数的后四位
  • 然后根据取出的后四位结合上面创建的十六进制字符数组得到对应的十六进制
  • 直到传入参数为0,并且结果字符串的长度等于8的时候结束循环
  • 返回结果即可
  • 另外,C语言需要注意’\0’也占一位

七【时间频度】

  • 时间复杂度: O ( k ) O(k) O(k) k k k为传入参数二进制的位数
  • 空间复杂度: O ( k ) O(k) O(k) k k k为传入参数二进制的位数

八【代码实现】

  1. Java语言版
class Solution {
    
    
    public String toHex(int num) {
    
    
        if(num == 0){
    
    
            return "0";
        }
        StringBuffer sb = new StringBuffer();
        char[] map = {
    
    '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
        while(num != 0 && sb.length() < 8){
    
    
            int index = num & 0xf;
            sb.insert(0,map[index]);
            num >>= 4;
        }
        return sb.toString();
    }
}
  1. C语言版
char * toHex(int num)
{
    
    
    if(num == 0)
    {
    
    
        return "0";
    }
    char map[16] = {
    
    '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    char* res = (char*)calloc(9,sizeof(char));
    for(int i = 7;i>=0;i--)
    {
    
    
        int temp = num & 0xf;
        res[i] = map[temp];
        num >>= 4;
    }
    res[8] = '\0';
    while(res[0] == '0')
    {
    
    
        res++;
    }
    return res;
}
  1. Python语言版
class Solution:
    def toHex(self, num: int) -> str:
        if num == 0:
            return "0"
        map = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
        res = []
        while num != 0 and len(res) < 8:
            res.insert(0,map[num & 0xf])
            num >>= 4
        return "".join(res)
  1. C++语言版
class Solution {
    
    
public:
    string toHex(int num) {
    
    
        if(num == 0)
        {
    
    
            return "0";
        }
        char map[16] = {
    
    '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
        char* res = (char*)calloc(9,sizeof(char));
        for(int i = 7;i>=0;i--)
        {
    
    
            int temp = num & 0xf;
            res[i] = map[temp];
            num >>= 4;
        }
        res[8] = '\0';
        while(res[0] == '0')
        {
    
    
            res++;
        }
        return res;
    }
};

九【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  3. Python语言版
    在这里插入图片描述

  4. C++语言版
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/IronmanJay/article/details/129743396