磕磕绊绊完成了第一道简单题,来到第二题又被难住了,每次都要感慨一下菜菜菜!
【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!!!
知识点:负数除余;溢出解决