【LeetCode】整数分类之整数反转

目录

题目

示例

解题思路

算法推演

实现代码

复杂度分析


题目

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

 

示例

示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21示例 4:输入: 55输出: 55

 

解题思路

算法推演

题目给出假设只能存储得下32位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1],所以我们要加入溢出检测。

我们的想法是反复获取X的最后一位数字,并把它放到sum的后面,这样就能保证最后x与sum正好是相反的。一般我们会进行下面的操作。

last_value = x % 10;x /= 10;sum = sum * 10 + last_value

但是这样很危险因为sum = sum * 10 + last_value时可能会溢出。所以我们要提前检测。

情况一、正溢出情况

// INT_MAX = (pow(2, 31) - 1)sum * 10 + last_value > INT_MAX
  • 当出现 sum > INT_MAX / 10并且还有last_value需要相加则一定溢出。
  • 当出现 sum == INT_MAX / 10并且last_value > 7时则一定溢出。7是2^32 -1的个位数。

情况二、负溢出情况

// INT_MIN = pow(-2, 31)sum * 10 + last_value < INT_MIN
  • 当出现 sum < INT_MIN / 10并且还有last_value需要相加则一定溢出。
  • 当出现 sum == INT_MIN / 10并且last_value < -8 时则一定溢出。8是-2^32的个位数。

具体代码如下所示:

 

实现代码

class Solution {public:    int reverse(int x) {        int sum     = 0;        int last_value = 0;        int int_max = pow(2,31)-1;        int int_min = pow(-2,31);        bool positive_overflow = false;        bool negative_overflow = false;        while(x != 0) {            last_value = x % 10;            positive_overflow = ((int_max / 10) < sum)  || ((int_max == sum) && (last_value > 7));            negative_overflow = ((int_min / 10) > sum)  || ((int_min == sum) && (last_value < -8));;            if(positive_overflow || negative_overflow) {                return 0;            }            sum = sum * 10 + last_value;            x = x / 10;        }        return sum;    }};

复杂度分析

时间复杂度: O(log(x)),x中大约有log10(x)位数字。

空间复杂度: O(1)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值