7. 整数反转-E

2019-04-13 20:34发布

class="markdown_views prism-github-gist">

7. 整数反转-E

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123
输出: 321
示例 2: 输入: -123
输出: -321
示例 3: 输入: 120
输出: 21
注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
  • 分析
    因为取模对于正负数都可用,所以无需担心符号问题;但对于溢出问题,确实需要考虑;本题,解决的是伪溢出问题,函数参数是64位的int,但输入是32位的数据,所以就可以将反转数的绝对值和32位中的最大值想比较;
    另外,有一个未经完整验证的方法,即bk:=ret,ret*=10后若溢出,那么很大概率上ret/10应该发生变化,所以可以判断bk和ret/10是否相等,判断是否溢出;
    若要更高精确,可用数组存储数字,通过数字比较查看是否发生变化,判断是否溢出。
  • code1
var max int=2147483647 func reverse(x int) int { ret:=0 for x!=0{ ret=ret*10+x%10 if ret>max||-ret>max{//伪溢出判断 return 0 } x/=10 } return ret }
  • code2
/* 2^(31)-1=2147483647 输入 x=1534236469 x*10溢出 */ func reverse(x int) int { ret:=0 for x!=0{ bk:=ret ret=ret*10+x%10 if ret/10!=bk{ return 0 } x/=10 } return ret }