前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode-7.整数反转 取模反转法与字符串法

LeetCode-7.整数反转 取模反转法与字符串法

原创
作者头像
扎克蕉
修改2020-10-21 11:59:35
7410
修改2020-10-21 11:59:35
举报

题目

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

示例 1:

输入: 123

输出: 321

示例 2:

输入: -123

输出: -321

示例 3:

输入: 120

输出: 21

注意:

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

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/reverse-integer

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


看到题目,会觉得很简单,相信大家肯定都遇到过这种题,但是本题唯一的难点在于溢出的判断。

我想了两种办法,一种是常规的取模反转,另一种是字符串法。

方法一(取模反转法):

如果使用这个方法,我们要知道题目所给的数值范围:2^31-1=2147483647,-2^31=-2147483648

接下来我们只要找到溢出条件:取模到极限值的最后一位时的判断,详见下方代码注释。

代码语言:txt
复制
#include <iostream>
using namespace std;

/**
 * LeetCode
 * 7. 整数反转 - 取模反转法
 * https://space.bilibili.com/54183978
 */

class Solution {
public:
    int reverse(int x) {
       int ans = 0;
       while(x != 0){
           int tem = x % 10;
           // ans大于214748364 或者 ans=214748364且最后一位大于7
           if( ans > INT_MAX / 10 || (ans == INT_MAX / 10 && tem > 7)) return 0;
           // ans小于214748364 或者 ans=214748364且最后一位小于-8
           if( ans < INT_MIN / 10 || (ans == INT_MIN / 10 && tem < -8)) return 0;
           ans = ans*10 + tem;
           x = x / 10;
       }
        return ans;
    }
};

int main(){
    Solution solution;
    cout << solution.reverse(-123);
}

测评结果:

1032 / 1032 个通过测试用例

状态:通过

执行用时: 4 ms

内存消耗: 5.8 MB

方法二(字符串法):

这个方法会比较低效,其核心思想是对整数取模,每位取出来的数字转成字符,拼接到新的字符串上实现反转。然后利用C++的异常捕捉机制来判断是否运算溢出。

这里要知道C++中的int和string互转的方法:

int转string:to_string

string转int:stoi

代码语言:txt
复制
/**
 * LeetCode
 * 7. 整数反转 - 字符串方法(效率很低)
 * https://space.bilibili.com/54183978
 */

class Solution {
public:
    int reverse(int x) {
        string ans = "";
        int flag = 0;
        if(x < 0){
            flag = 1;
            ans = "-";
        }
        while(x!=0){
            if(flag){
            	// to_string:int转string
                ans = ans + to_string(-(x%10));
            } else{
                ans = ans + to_string(x%10);
            }
            x /= 10;
        }
        try{
        	// string转int
            return stoi(ans);
        } catch (std::invalid_argument) {
            return 0;
        } catch (std::out_of_range&) {
            return 0;
        }
    }
};

int main(){
    Solution solution;
    cout << solution.reverse(-123);
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com