代码训练LeetCode(14)整数反转

这篇具有很好参考价值的文章主要介绍了代码训练LeetCode(14)整数反转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码训练(14)LeetCode之整数反转

Author: Once Day Date: 2024年4月9日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 190. 颠倒二进制位 - 力扣(LeetCode)
  • 7. 整数反转 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台
1. 原题

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

这个任务是一个数字处理问题,我们要把一个32位有符号整数中的数字翻转过来,并且要注意处理溢出的情况。如果翻转后的整数超过了给定的32位有符号整数范围,就返回0。

2. 分析

题目要求我们实现一个函数,输入一个32位有符号整数x,输出一个整数,它是x的数字部分翻转后的结果。如果翻转后的结果超出了[-2^31, 2^31 - 1]的范围,就返回0。

翻转一个整数的数字可以通过取模和除法操作来完成。我们可以循环地从x中提取每一位数字,然后将它添加到结果变量中,同时考虑到符号和溢出的问题。

分析步骤

  1. 初始化一个变量来存储翻转后的整数。
  2. 处理整数x的符号,并在处理过程中使用绝对值。
  3. 使用循环结构,每次循环:
    • 通过取模操作获取x的最低位数字。
    • 通过除法操作将x的最低位移除。
    • 将结果变量乘以10,并加上提取的数字,实现翻转。
    • 在每次操作后检查是否有溢出情况发生。
  4. 根据原始整数的符号,返回翻转后的结果,如果有溢出则返回0。

假设输入整数为123,我们希望得到翻转后的整数321。

  1. 初始化结果变量为0。
  2. 第一次循环:
    • 取模:123 % 10 = 3
    • 除法:123 / 10 = 12
    • 翻转:0 * 10 + 3 = 3
  3. 第二次循环:
    • 取模:12 % 10 = 2
    • 除法:12 / 10 = 1
    • 翻转:3 * 10 + 2 = 32
  4. 第三次循环:
    • 取模:1 % 10 = 1
    • 除法:1 / 10 = 0
    • 翻转:32 * 10 + 1 = 321
  5. 结束循环,输出翻转后的整数321。

主要操作是循环中的基本算术运算,这里除法可以进行一些优化,比如同时返回商和除数,不过这个属于指令优化范畴。

此外,还可以优化一下边界值判断和循环过程,比如对于32位整数,范围是[-2147483648, 2147483647],可以排除0值和-2147483648这两种情况,然后取绝对值进行反转操作。

同时要注意到,如果数字不超过9位,是不需要进行过多判断的,因为不管怎么反转,9位数是不会超过32位有符号整数的表示范围。只需要对10位数进行判断,如果低9位数反转后超过了214748364大小,这个10位数必然超过了范围,直接返回零值即可。

3. 代码实现
int reverse(int x){
    int i, temp;
    int abs_x, result;

    if (x == 0x80000000) {
        return 0;
    }

    if (x == 0) {
        return 0;
    }

    abs_x = x < 0 ? -x : x;
    result = 0;
    for (i = 0; i < 9; i++) {
        temp = abs_x % 10;
        abs_x = abs_x / 10;
        result = result * 10 + temp;
        if (abs_x == 0) {
            goto end;
        }
    }

    if (result > 214748364) {
        return 0;
    }
    result = result * 10 + abs_x;

end:
    return x < 0 ? -result:result;
}

这个函数的作用是反转一个有符号整数,并返回反转后的结果:

  1. 首先判断输入的整数 x 是否为 0x80000000(即 -2^31,INT_MIN)或 0,如果是则直接返回 0,因为这两个数反转后会溢出。
  2. x 的绝对值赋给变量 abs_x,用于后续计算。
  3. 初始化结果变量 result 为 0。
  4. 使用循环进行反转操作,最多循环 9 次:
    • 取出 abs_x 的最低位数字,即 abs_x % 10,赋给变量 temp
    • abs_x 除以 10,去掉最低位数字。
    • result 乘以 10,再加上 temp,即将当前位数字添加到结果的末尾。
    • 如果 abs_x 已经为 0,说明所有位都处理完毕,跳转到 end 标签处。
  5. 在循环结束后,判断 result 是否大于 214748364(即 INT_MAX / 10),如果是,说明反转后的数字溢出了,返回 0。
  6. 如果 result 未溢出,将 abs_x 的最后一位数字添加到 result 的末尾。
  7. end 标签处,根据原始输入 x 的正负性,决定返回 result 的正负形式。

这个函数通过循环取出整数的每一位数字,并将其反转拼接到结果中,最后根据原始整数的正负性返回相应的结果。函数还考虑了整数溢出的情况,如果反转后的整数超出了 32 位有符号整数的范围,则返回 0。

运行结果如下所示(仅供参考):

代码训练LeetCode(14)整数反转,#  十年代码训练,leetcode,算法

4. 总结

这个编程题测试了对基本算术运算的理解,以及对整数溢出问题的处理。重点应该放在熟练掌握基本的运算和逻辑控制,以及增强对边界情况处理的意识。在解决类似问题时,编写清晰且易于理解的代码是非常重要的。文章来源地址https://www.toymoban.com/news/detail-859421.html

到了这里,关于代码训练LeetCode(14)整数反转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录Leetcode 343. 整数拆分

            dp[i]表示i所能拆分的最大乘积,则dp[i] 与dp[i - 1]的递推公式是:                 max( 1~n * dp[n ~ 1])

    2024年02月21日
    浏览(85)
  • LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

    题目链接:343. 整数拆分 题目描述: 给定一个正整数  n  ,将其拆分为  k  个  正整数  的和(  k = 2  ),并使这些整数的乘积最大化。 返回  你可以获得的最大乘积  。 示例 1: 示例 2: 提示: 2 = n = 58 算法分析: 定义dp数组及下标含义: dp[i]表述正整数i拆分成k个正整数

    2024年02月04日
    浏览(42)
  • Leetcode算法系列| 12. 整数转罗马数字

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如

    2024年02月02日
    浏览(46)
  • 【算法与数据结构】343、LeetCode整数拆分

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :博主做这道题的时候一直在思考,如何找到 k k k 个正整数, k k k 究竟为多少合适。从数学的逻辑上来说,将 n n n 均分为 k k k 个数之后, k k k 个数的乘积为最大(类似于相同周长

    2024年01月17日
    浏览(52)
  • 算法leetcode|92. 反转链表 II(rust重拳出击)

    给你单链表的头指针 head 和两个整数 left 和 right ,其中 left = right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 链表中节点数目为 n 1 = n = 500 -500 = Node.val = 500 1 = left = right = n 你可以使用一趟扫描完成反转吗? 将链表分成3部分,即前面不需要反转的部

    2024年02月05日
    浏览(50)
  • 代码随想录第三天|链表理论基础,LeetCode203.移除链表元素, LeetCode707.设计链表,LeetCode 206.反转链表

    链表: 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。 链表的入口节点称为链表的头结点也就是head。 链表类型: 1.单链表 单链表中的指

    2024年02月11日
    浏览(53)
  • 【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法

    👑作者主页:@进击的安度因 🏠学习社区:进击的安度因(个人社区) 📖专栏链接:每日挠头算法题 如果无聊的话,就来逛逛 我的博客栈 吧! 🌹 今天为大家带来的是力扣上的一道简单题:数组形式的整数加法。这道题我在2个月前就尝试过,但是没有解答出来。两个月后

    2024年01月25日
    浏览(47)
  • 代码训练LeetCode(15)买卖股票

    代码训练(15)LeetCode之买卖股票 Author: Once Day Date: 2024年4月22日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 122. 买卖股票的最佳时机 II - 力扣(LeetCode) 力扣 (LeetCode) 全球极客挚爱的技术成长平台 1. 原题 给你一个整数数组

    2024年04月27日
    浏览(26)
  • 代码训练LeetCode(6)编辑距离

    代码训练(6)LeetCode之编辑距离 Author: Once Day Date: 2024年3月9日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 72. 编辑距离 - 力扣(LeetCode) 力扣 (LeetCode) 全球极客挚爱的技术成长平台 1. 原题 给你两个单词 word1 和 word2 , 请返回

    2024年03月12日
    浏览(32)
  • 代码训练LeetCode(5)最长连续序列

    代码训练(5)LeetCode之最长连续序列 Author: Once Day Date: 2024年3月9日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 128. 最长连续序列 - 力扣(LeetCode) 力扣 (LeetCode) 全球极客挚爱的技术成长平台 1. 原题 给定一个未排序的整数数组

    2024年03月24日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包