【简单】7-整数反转 Reverse Integer

题目

Given a 32-bit signed integer, reverse digits of an integer.

Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

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

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

Example1

输入: 123
输出: 321

Example2

输入: -123
输出: -321

Example3

输入: 120
输出: 21

解法

方法一:字符串

解题思路

可以用字符串形式存储数据,将其反转后再转换成int数据,如果转换失败就溢出,此时返回0,转换成功则判断正负性

代码

class Solution {
public:
    int reverse(int x) {
        if(x == 0)
            return 0;
        string s  = to_string(x);
        string res;
        res.assign(s.rbegin(), s.rend());
        try{
            int a = stoi(res);
            a = s[0] == '-' ? -a : a;
            return a;
        }
        catch (std::out_of_range&){
            return 0;
        }
        
    }
};

方法二:逐位计算

解题思路

常规办法,使用%依次找到最后一位newnum,再依次将结果res*10之后加入最后即可得到,关键点是如何判断溢出。int的范围是-2147483648 ~ 2147483647

INT_MAX 2147483647 01111111 11111111 11111111 11111111
INT_MIN -2147483648 10000000 00000000 00000000 00000000

如果是正数,0<=newnum<=9:如果res<214748364,那么可以正常加入newnum;如果res=214748364,newnum不可超过7,否则会溢出;如果res>214748364,那么一定会溢出
如果是负数,0>=newnum>=-9:如果res>-214748364,那么可以正常加入newnum;如果res=-214748364,newnum不可小于-8,否则会溢出;如果res<-214748364,那么一定会溢出

代码

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

方法三:long

解题思路

leetcode上看到的标准方法,用long存储数据(真实犯规)

代码

不想加了

总结

原来字符串反转也是有救的,try catch就行了,就是慢了点

posted @ 2020-04-16 12:54  陌良  阅读(140)  评论(0编辑  收藏  举报