力扣7. 整数反转3种方法

给你一个 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-integer 

 

 方法1:

#include <iostream>
#include <string>
using namespace std;


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; 
    }
};

 

方法2(转string计算)

//思路先反转,再判断数值溢出。
class Solution {
private:
    //寻找前面的0,一直0到什么位置
    int rfind(const string& s) {
        int i = 0;
        while (s[i] == '0') i++;
        return i;
    }

public:
    int reverse(int x) {
        if (x > -10 && x < 10) return x;

        string s_max = to_string(INT_MAX);
        string s_min = to_string(INT_MIN).substr(1);
        string s = to_string(x);

        if (x < 0) s = s.substr(1);//复制字符串 ,从符号后面开始,切掉符号

        std::reverse(s.begin(), s.end());//反转Vector容器
        s = s.substr(rfind(s));

        if (x < 0) {
				//负数
            if (s.length() == s_min.length() && s > s_min) return 0;//长度不一样比较不了
            return stoi("-" + s);
        }		//正数
        else {
            if (s.length() == s_max.length() && s > s_max) return 0;
            return stoi(s);
        }
        return 0;
    }
};

方法3(十分之一结尾的数)

#include <iostream>
#include <string>
using namespace std;
class Solution {
    //+2147483647
    //-2147483648
public:
    int reverse(int x) {
        int a = x;
        int res = 0;
        while (x != 0) {
            //每次取末尾数字
            int tmp = x % 10;
            //判断是否 大于 最大32位整数  2147483647
            if (res > 214748364 || (res == 214748364 && tmp > 7)) {
                return 0;
            }
            //判断是否 小于 最小32位整数  -2147483648
            if (res < -214748364 || (res == -214748364 && tmp < -8)) {
                return 0;
            }
            res = res * 10 + tmp;
            x /= 10;
        }
        return res;
    }
};
 
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值