首页 > 其他 > 详细

LeetCode-7.reverse-integer 【翻转字符串】【数学】

时间:2019-12-07 22:39:48      阅读:93      评论:0      收藏:0      [点我收藏+]

PS: 第一次写文章好累啊,没想到这么短的文章写完这么累,大家给我点反馈,多给我留言啊。

 

??题目描述:

给定32位带符号的整数,将数字反转。

比如: 123 -> 321  |  -234 -> -432

值的取值范围在: [−2^31,  2^31 − 1]

 

??解题思路:

基本过程:

1. pop x的最后一个数字

2. 把这个数字push到rev里

3. 重复1, 2

 

也就是:

//pop operation:
pop = x % 10;  # %表示取余数,pop的值就是x的最后一位
x /= 10;  # x去掉最后一位后剩下的数字

//push operation:
temp = rev * 10 + pop;  
rev = temp;

提前预测数字会不会溢出:
技术分享图片 

注意: intmax = 2^31 -1 = 2147483647, 令rev是正数。

发生溢出的情况是: temp = rev *10 + pop >= intmax, 这里rev代表的是temp除开最后一位剩下的数字,pop是temp最后一个数字,所以当rev >= intmax//10 (右边是指把intmax去掉最后一位)就溢出了; 而如果是<,就一定不会溢出; 如果是等于,就要比pop的大小, 只有pop大于7的情况才会发生溢出(因为intmax最后一位是7)

当处理负数的情况分析也如上。

 

??代码:

class Solution(object): 
  
def reverse(self, x): """ :type x: int :rtype: int """
     # 溢出值
MAX_VALUE = 2 ** 31 - 1 MIN_VALUE = -2 ** 31 rev = 0 sign = [1, -1][x < 0] # 符号存储,x大于零就是1,小于零是-1 x = abs(x) # 所有数字换成正数处理,最后再还原它的符号 while x != 0: pop = x % 10 x = x // 10         # 处理溢出情况: 预测更新了rev会不会发生溢出 if rev > MAX_VALUE //10 or (rev == MAX_VALUE // 10 and pop > 7) or rev < MIN_VALUE // 10 or (rev == MIN_VALUE / 10 and pop < -8): return 0
       # 把x取出来的最后一位push到rev中 rev
= rev * 10 + pop return sign * rev

 

LeetCode-7.reverse-integer 【翻转字符串】【数学】

原文:https://www.cnblogs.com/siguamatrix/p/12003622.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!