刷题日记-405. 数字转换为十六进制数

122 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

405. 数字转换为十六进制数 - 力扣(LeetCode) (leetcode-cn.com)

给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

注意:

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

示例 1:

输入:
26

输出:
"1a"

示例 2:

输入:
-1

输出:
"ffffffff"

二、思路分析

  1. 需要对底层有一些了解,比如有符号数和无符号数运算自动变成无符号数。
  2. 利用栈除数取余,然后逆过来。

三、AC 代码

char * toHex(int num){
    if(num == 0)
        return "0";
    char stack[100];
    int top = -1;
    unsigned val = num;
    while(val  != 0){
        int a = val % 16;
        val = val / 16;
        if(a > 9){
            char c = 'a' + (a - 10);
            stack[++top] = c;
        }else{
            stack[++top] = '0' + a;
        }
    }
    char* str = (char*)malloc(sizeof(char) *  (top+2));
    str[top+1] = '\0';
    int len = top+1;
    for(int i = 0; i < len; i++){
        str[i] = stack[top--];
    }
    return str;
}

范文参考

【算法小爱】国庆2.0(附带技术类文章目录) - 数字转换为十六进制数 - 力扣(LeetCode) (leetcode-cn.com)