7-整数反转

题目:

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

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

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

输入: 120
输出: 21
注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

解答:

  • 首先想到的是字符串反转,然后类型转换,效率不行
  • 重点在于判断是否溢出,采用较长的数据类型来存储结果,下面采用的是long long,官方答案有更好的方法
  • 注意最后判断使用的方法:判断强制类型转换为int后是否与原数据相等,如果相等则没有溢出
  • while循环的判断条件:x!=0 因为x每次 /=10 最终肯定为0,这样不用判断数据是否为正负

注意:

  写完代码后,需要找几个特殊输入进行测试,例如0 10 等情况,以减少代码bug。

int reverse(int x) 
{
        if (x<10 && x> -10)//只有一位的直接返回
        {
            return x;
        }

        long long result = 0;
        while (x != 0)
        {
            result = result*10 + (x % 10);
            x /= 10;
        }

        return ((int)result ==result)? (int)result : 0;
    }

 答案给的判断溢出:

while循环中,result = result *10 + x%10; 在这里判断

  • result > MAX_INT/10,因为之后要*10再加上余数;
  • 如果 result==MAX_INT/10,则判断 x%10 是否  > MAX_INT%10,即加上的数字是否刚好超过MAX_INT的最后一位,对于32bit的int,最后一位为7
  • 如果 x < 0 按照类似的逻辑判断
  • 采用 MAX_INT%10  MIN_INT%10可以不用记住末位的数字,而且后续也好扩展
  • 上面采用long long 存储结果是取巧行为,如果要写成一个模板方法的话,直接不能用了,所以还是要分析细节

 

posted @ 2020-10-12 15:03  adfas  阅读(79)  评论(0编辑  收藏  举报