LeetCode刷题:7.整数反转+答案分析

前言

  • 文章作为日记或心得,记录学习过程
  • 本文记录本题(源自LeetCode)遇到的所有问题、疑惑
  • 如对内容有任何建议或看法,欢迎评论区学习交流

正文

题目

LeetCode刷题:7.整数反转+答案分析_第1张图片
根据示例,需要考虑不同情况的处理。
常用的一种方法是取余乘十后加起来。
需要考虑的问题为注意事项中的整数的溢出问题,像这样的要求我之前也没有接触过,所以刚开始的几次提交出现了很多问题。

错误的解答

class Solution {
public:
    int reverse(int x) {
        long ans=0;
        if(x<0)
        {
            x=-x;
            while(x!=0)
            {
                //上次结果*10后再取x%10放到后面
                ans=ans*10+x%10;
                //更新x的值
                x=x/10;
            }
            return -ans>INT_MAX||-ans<INT_MIN?0:-ans;
        }
        else if (x>0)
        {
            while(x!=0)
            {
                ans=ans*10+x%10;
                x=x/10;
            }
            return ans>INT_MAX||ans<INT_MIN?0:ans;
        }
        else
            return 0;
    }
};

之前是不清楚c++的负数取余规则,看了几篇答案之后大概清楚了,比如-5%3=-2,-12%10=-2,所以对于该题,不用像上面一样去分类了。

上面的错误还有第七行的x=-x
因为整型的取值范围在-231=-2147483648231-1=2147483647,所以这个语句在处理x=-231=-2147483648时,取负数之后就会越界。
当然,由于不用分正负讨论了,全部代码都要重做。

其他人的解答

官方给的判断是否溢出的方法我觉得有些不太能接受,每次循环判断ans=ans*10+x%10;是否溢出,

LeetCode刷题:7.整数反转+答案分析_第2张图片

			if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
            if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;

这两句有种特殊值的感觉,对于不熟悉-231=-2147483648231-1=2147483647这两个数字的初学者可读性不是很好。

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

作者:LeetCode
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
来源:力扣(LeetCode)

sms的解答很像官方的过程,但是却没有7和-8的内容,却仍可以通过测试

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

作者:sms
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-sms-2/
来源:力扣(LeetCode)
int main()
{
	if(typeid(INT_MAX)==typeid(int))
	cout << 1 << endl;
}

vs运行后得知INT_MAX是整型,所以INT_MAX / 10为214748364
rev>214748364的情况(*10肯定溢出,根据判断条件直接返回0)就不再考虑,下面考虑特殊情况
rev=214748364,使rev * 10 + x % 10溢出,则需要x>7,然而实际上,若x的原来位数和231-1=2147483647相等为10位的话,x顶多只能取1和2,而由于rev=214748364,所以x只能是1463847412,x连2都取不到更不要说大于7了。
所以只需要判断rev > INT_MAX / 10 || rev < INT_MIN / 10即可

由此看来,sms的代码虽然简单易懂,但其背后的含义需要深入理解,不然遇到类似问题的话,只是套用sms的模板很有可能会出错,这时候,官方答案的优势就体现出来了,其代码更加严谨、更具有适用性。

你可能感兴趣的:(刷题)