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