首页 > 其他分享 >LeetCode 7.整数反转

LeetCode 7.整数反转

时间:2024-03-11 14:33:44浏览次数:29  
标签:10 INT 反转 rev ret int 整数 MAX LeetCode

题目:

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

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

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

示例 1:

输入:x = 123
输出:321
示例 2:

输入:x = -123
输出:-321
示例 3:

输入:x = 120
输出:21
示例 4:

输入:x = 0
输出:0

提示:

-231 <= x <= 231 - 1

笔者思路

这题比较简单,无非就是加减乘除而已,使用乘以10再加新数字ret = ret * 10 + rem的形式即可。
主要是要考虑对于一些特殊数组会溢出的问题。比如12****8979,这个数组反过来很可能就大于INT_MAX了。使用乘以10再加上新数字的算法,就可能异常。
可以反过来,思考,既然乘以10再加上新数字的结果跟INT_MAX比较可能异常,使用INT_MAX减去新数字再除以10跟原数字相比即可。
所以代码如下:

class Solution {
public:
    int reverse(int x) {
        if(x==INT_MIN)//剔除这个特殊情况后,x就对称了 
            return 0;

        bool f = (x >= 0);//符号
        int ret = 0;

        x = f ? x : -x;
        while(x > 0){
            int rem = x % 10;//余数
            x = x / 10;//新的x
            if((INT_MAX - rem) / 10 < ret){//直接算可能溢出,反过来由INT_max计算出预计算出的ret是否满足
                return 0;
            }
            ret = ret * 10 + rem;//如果没有上面的排查,这里会溢出
        }
        return f ? ret : -ret;
    }
};

官方解答

class Solution {
public:
    int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {
                return 0;
            }
            int digit = x % 10;
            x /= 10;
            rev = rev * 10 + digit;
        }
        return rev;
    }
};

官方又了一堆数学公式,证明了只需要考虑 (rev < INT_MIN / 10 || rev > INT_MAX / 10)即可。其实跟我的代码(INT_MAX - rem) / 10 < ret)是差不多的意思,只是我的代码这样免得更多的数学思考了。

另外有一点,我的算法之所以将负数区分开考虑,是因为我实在不知道-12除以10到底是余2还是余8还是-2。不过经过实验-12/10=-1......-2。所以官方的解答更为简便一些。

总结

(1)-12除以10,商为-1,余数为-2
(2)比较计算,如果会导致原始值x计算后(比如乘以10)大于INT_MAX,可以反向思考,使用INT_MAX反向计算(除以10)看结果是否小于原始值x

标签:10,INT,反转,rev,ret,int,整数,MAX,LeetCode
From: https://www.cnblogs.com/dongfangchun/p/18066020

相关文章

  • [LeetCode] 2129. Capitalize the Title
    Youaregivenastringtitleconsistingofoneormorewordsseparatedbyasinglespace,whereeachwordconsistsofEnglishletters.Capitalizethestringbychangingthecapitalizationofeachwordsuchthat:Ifthelengthofthewordis1or2letters......
  • leetcode 528/ LCR 071 按权重随机选择
    leetcode528/LCR071按权重随机选择528.按权重随机选择LCR071.按权重随机选择题目描述给定一个正整数数组w,其中w[i]代表下标i的权重(下标从0开始),请写一个函数pickIndex,它可以随机地获取下标i,选取下标i的概率与w[i]成正比。例如,对于w=[1,3],挑选下标0......
  • leedcode 反转链表
    自己写的,遍历一遍链表,再反向生成一个新链表classSolution:defreverseList(self,head:Optional[ListNode])->Optional[ListNode]:#检查链表是否为空ifnothead:returnNone#初始化一个空列表,用于存储原始链表节点的值......
  • LeetCodeHot100 283. 移动零 11. 盛最多水的容器 15. 三数之和 42. 接雨水
    283.移动零https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-likedpublicvoidmoveZeroes(int[]nums){intr=0;for(inti=0;i<nums.length;i++){if(nums[i]!=0){......
  • LeetCode 128.最长连续序列 Python题解
    leetcode128题最长连续序列分享解题思路,使用哈希表算法......
  • 通达信强烈反转指标,趋势改变上翘有力度源码
    {通达信强烈反转指标,趋势改变上翘有力度源码}N1:=20;N2:=60;VAR1:=(LOW+HIGH+CLOSE)/3;X:MA(VAR1,5);A1:HHV(X,N1)COLORMAGENTA;A2:HHV(X,N2),COLORGREEN;A3:HHV(HIGH,N2)*0.98,COLOR0000FF;B1:LLV(X,N1);B2:LLV(LOW,N2)*1.02;DRAWICON(X>B1ANDREF(X,1)=REF......
  • 【LeetCode】整数转罗马数字 C语言 | 此刻,已成艺术(bushi)
    Problem:12.整数转罗马数字目录思路解题方法复杂度Code思路暴力破解+转换解题方法由思路可知复杂度时间复杂度:$O(n)$空间复杂度:$O(1)$Codechar*intToRoman(intnum){char*s=(char*)malloc(sizeof(char)*4000),*p=s;while(num>0)......
  • 通达信强烈反转主图指标公式源码
    {通达信强烈反转主图指标公式源码}N1:=20;N2:=60;VAR1:=(LOW+HIGH+CLOSE)/3;X:MA(VAR1,5);A1:HHV(X,N1)COLORMAGENTA;A2:HHV(X,N2),COLORGREEN;A3:HHV(HIGH,N2)*0.98,COLOR0000FF;B1:LLV(X,N1);B2:LLV(LOW,N2)*1.02;DRAWICON(X>B1ANDREF(X,1)=REF(B1,1),B1*0......
  • LeetCodeHot100 283. 移动零 11. 盛最多水的容器 42. 接雨水 15. 三数之和
    283.移动零https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-likedpublicvoidmoveZeroes(int[]nums){intr=0;for(inti=0;i<nums.length;i++){if(nums[i]!=0){......
  • 代码随想录算法训练营day17 | leetcode 110. 平衡二叉树、257. 二叉树的所有路径、404
    目录题目链接:110.平衡二叉树-简单题目链接:257.二叉树的所有路径-简单题目链接:404.左叶子之和-简单题目链接:110.平衡二叉树-简单题目描述:给定一个二叉树,判断它是否是平衡二叉树示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,nul......