当前位置: 首页 > news >正文

LeetCode 405 - 数字转换为十六进制数

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
      • 示例 1
      • 示例 2
    • 题解答案
    • 题解代码分析
      • 代码解析
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

十六进制表示在我们日常开发中其实非常常见——不论是颜色代码(如 #ff6600)、内存地址、还是底层字节序列的可读展示,十六进制都是一种简洁高效的数值表达方式。

这道题要求我们手动实现一个整数到十六进制字符串的转换过程,不能直接调用语言自带的格式化函数。听起来像是“造轮子”,但其实这是一个非常实用的底层练习,有助于理解位运算、补码表示和数据编码。

描述

题目要求:
给定一个整数 num,返回它的十六进制字符串表示。
结果必须全部为小写字母,且没有前导零(除了数值为 0 的情况)。

另外一个细节是:
对于负数,我们需要按照 32 位补码(two’s complement) 的形式来表示结果。

示例 1

输入: num = 26
输出: "1a"

示例 2

输入: num = -1
输出: "ffffffff"

题解答案

这类题的核心是掌握整数与二进制、十六进制之间的转换关系。

我们知道:

  • 十六进制的每一位可以由 4 个二进制位表示;
  • 因此,一个 32 位整数刚好对应 8 个十六进制字符;
  • 我们可以通过 按位与(&)操作 每次取出低 4 位,然后右移 4 位来逐步构造结果字符串。

算法流程如下:

  1. 如果 num 为 0,直接返回 "0"

  2. 定义一个字符映射表 "0123456789abcdef"

  3. 对 num 做 8 次循环:

    • 取出低 4 位 (num & 0xf);
    • 对应映射表取出字符;
    • 将字符拼接在结果字符串前面;
    • 右移 4 位;
    • 如果 num 变为 0,可以提前结束。
  4. 对于负数,由于 Swift 的整数是有符号的,我们用 UInt32(bitPattern: Int32(num)) 将其按位 reinterpret 成无符号数,这样负数会变成它的补码形式。

题解代码分析

下面是完整可运行的 Swift 代码

import Foundationclass Solution {func toHex(_ num: Int) -> String {// 如果输入是 0,直接返回 "0"if num == 0 {return "0"}// 十六进制字符映射表let hexMap = Array("0123456789abcdef")// 使用 UInt32 重新解释 Int32 的位模式,处理负数补码var n = UInt32(bitPattern: Int32(num))var result = ""// 最多 8 位(32 bit ÷ 4 bit)while n != 0 {let index = Int(n & 0xf)  // 取出最低 4 位result = String(hexMap[index]) + resultn >>= 4                   // 右移 4 位}return result}
}// 示例调用
let solution = Solution()
print(solution.toHex(26))   // 输出: "1a"
print(solution.toHex(-1))   // 输出: "ffffffff"
print(solution.toHex(0))    // 输出: "0"

代码解析

逐行解释一下关键逻辑:

  1. if num == 0:边界情况,必须单独处理。

  2. UInt32(bitPattern: Int32(num))

    • Swift 中 Int 是有符号的;
    • 通过这种方式,可以把负数的二进制补码“按位”解读成无符号值;
    • 比如 -1 会变成 0xffffffff
  3. n & 0xf:每次取出最低 4 位(即 1 个十六进制位)。

  4. n >>= 4:右移 4 位,相当于去掉刚刚处理过的低位。

  5. 字符串拼接:由于我们从低位开始取,所以要把新字符拼到结果字符串前面。

示例测试及结果

我们来测试几组不同的输入值:

print(solution.toHex(26))   // 期望: "1a"
print(solution.toHex(0))    // 期望: "0"
print(solution.toHex(255))  // 期望: "ff"
print(solution.toHex(-1))   // 期望: "ffffffff"
print(solution.toHex(305419896)) // 期望: "12345678"

输出结果如下:

1a
0
ff
ffffffff
12345678

所有测试通过

时间复杂度

我们每次处理 4 位,总共最多处理 32 位,因此:

时间复杂度:O(1)
(严格来说是常数时间,因为整数长度固定)

空间复杂度

除了一个字符串和映射表外,没有额外开销:

空间复杂度:O(1)

总结

这道题看似是算法题,但其实更像一个“小型位运算实战”。

通过手动实现十六进制转换,我们能更清楚地理解:

  • 负数在计算机内部是如何用补码表示的;
  • 位运算如何让数据转换更高效;
  • 十六进制与二进制之间的天然映射关系。

在实际开发中,类似的逻辑可以用在:

  • 调试时打印底层数据结构(比如网络包、字节缓冲区);
  • 自定义序列化 / 加密算法;
  • 构造调试用的内存地址、颜色、或标识符。

这类题虽然小,但非常有助于提升对“数与位”的直觉理解。

http://www.dtcms.com/a/520697.html

相关文章:

  • 漳州做网站喊多少钱wordpress栏目更改无法显示
  • 集团公司网站欣赏如何做企业网站内链
  • 未来的 AI 操作系统(九)——灵魂架构:当智能系统拥有“自我”
  • 卡码网语言基础课(Python) | 20.排队取奶茶
  • ManySpeech —— 使用 C# 开发人工智能语音应用
  • 5G-A 与 5G 对比
  • 网站建设与 宣传关系wordpress 订单
  • Linux进程信号(贰):保存信号
  • 互联网站建设 天津台州网站建设惠店
  • 基于Python大数据的主流汽车价格分析可视化系统
  • Flutter状态管理原理详解
  • 如何选择网站项目企业营销推广怎么做
  • MCP Server 启动和应用
  • C语言通过函数实现素数验证
  • 软件无线电关键技术--基带QPSK 调制技术
  • Linux网络——应用层序列化反序列化
  • EWCCTF2025 Tacticool Bin wp
  • 【Trae+AI】和Trae学习搭建App_01(附加可略过):测试Trae的后端功能
  • 网站源码 下载查域名价格
  • 上海做网站联系电话山东兴华建设集团有限公司网站
  • 使用 Vue3 和 Element Plus 实现选择新增用户集下拉选项框,切换类型,有物业,网格,电子围栏,行政区划管理
  • Vue项目页面间,页面中跳转及刷新规划,何时使用router-view,router-link,iframe,slots ,使用场景,及对应场景的完整使用示例
  • 【Qt】VS Code配置Qt UI插件,vscode打开Qt Designer ,vscode打开Qt*.ui文件
  • 服务网站建设的公司安装网站系统
  • 直播做网站数字广东网络建设有限公司介绍
  • 宇树科技:决定更名
  • 2025年MathorCup 大数据竞赛明日开赛,注意事项!论文提交规范、模板、承诺书正确使用!2025年第六届MathorCup数学应用挑战赛——大数据竞赛
  • 【案例实战】鸿蒙智能日程应用性能优化实战:从卡顿到丝滑的完整历程
  • 创建网站商城电子商务企业网站建设前期规划方案
  • php租车网站源码营销型网站规划