Leetcode刷题记(2)——整数反转

磕磕绊绊完成了第一道简单题,来到第二题又被难住了,每次都要感慨一下菜菜菜!

【2】整数反转   简单

搬运工~

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

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

解法:如果只是正数的话很容易反转,只要使用除余运算遍历每位上的数字,再循环一次输出即可,时间复杂度与输入整数的位数有关。

另外可以改进直接一步得到反转后的数字:在循环里面使用rev=rev*10+x%10;

BUT!负数怎么算?

难点放错地方了!!!负数也可以直接用除余运算,真正的难点应该是溢出问题怎么解决!!!

分析一波:

32位整数的范围是-2147483648~2147483647,在计算翻转数rev时可能会溢出

eg:1000000009在循环计算rev时,90000000*10之后就会溢出报错,希望在溢出的时候直接输出0.

正数:rev*10>INT_MAX时会溢出,因此在rev>INT_MAX/10时会溢出,或rev==INT_MAX/10 && x%10>7时溢出;

负数:rev*10<INT_MIN时会溢出,因此在rev<INT_MIN/10时会溢出,或rev==INT_MIN/10 && x%10<-8时溢出。

进一步分析:

其实不用考虑rev==INT_MAX/10这种情况,因为输入的整数一定是在这个范围内,那么第一位数字一定是1或2,如果rev=214748364,则原数字第一位一定是1,反转后依然在范围内;如果是2原数字为246384712超出范围。由此以来只用考虑rev>INT_MAX/10这种情况。

一定要注意这里是rev与INT_MAX/10比较而不是原数字x!!!

知识点:负数除余;溢出解决

posted on 2019-05-05 18:34  不想睡觉的koala  阅读(116)  评论(0编辑  收藏  举报