1.1. 题目

1.1.1. 整数反转

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

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

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




1.1.2. 题解:

  • 反转整数,就是把数按照相反的顺序重新排列
  • 得注意是否超出了范围!
  • 正常来说, 大于-10小于10的数,反转还是自己

1.1.3. 思路:

  • 我尝试了两种方式,以前第一想法就是转换成字符串,然后字符串反向拼接,因为slice很好取数,然后再反转成整数
  • 现在对递归比较熟练了,直接递归转,先对数 跟 10 取商,把商返给下一层,另外,数与10取余就是要的个体数
  • 到最里面的时候,也就是以前的最高位现在是个数位,所以把最里层的数 m,然后返回 结果和 m 10,最后得到结果

1.1.4. 代码:

点击显示
 func reverse(x int) int {

     // 如果大于-10 且小于10 的 怎么反转都是自己,节约时间
     if x > -10 && x < 10{
         return x
     }

     a,_ := re(x,10)

     if a > 2147483648 - 1 || a < -2147483648 {
         return 0
     }

     return a
 }

 // 递归取数
 func re(x int, k int) (res int,m int) {
     // 把数 取余和整除,比如 12345 / 10 = 1234,然后取 1234 继续递归,得余数 5
     // 继续 1234 / 10 得 123,余数4 ,继续递归
     // ......
     // 然后到最里面,也就是到了 12345的1的位置
     // 把1 * 10 返回上一层,并把 10 * 10
     // 然后就是 2 * 100 + 10(之前一层的结果)
     // ...
     // 5* 10000 + 4321 得出结果
     s := x / k
     rem := x % k
     if s != 0 {
         res,m = re(s,k)
     }  else {
         // 最里面的时候,默认 m = 1,然后递归往回走,每层 * 10
         m = 1
     }
     res = res + rem * m
     return res,m*10
 }


 func reverse2(x int) int {
     // 区分下这个数是正数还是负数
     mius := 0
     if x < 0 {
         x = -x
         mius = 1
     }
     // 转成字符串
     xStr := strconv.Itoa(x)
     newStr := ""
     // 字符串拼接
     for i:=len(xStr)-1;i>=0;i-- {
         newStr = newStr + string(xStr[i])
     }
     // 反转后的字符串转整数,如果不成功,说明超出范围了,直接返回0
     res,err := strconv.Atoi(newStr)
     if err != nil {
         return 0
     }
     // 判断临界点
     power := 2147483648 - 1
     if res > power  {
         return 0
     }
     // 根据 上面的界定,如果是负数,返回负数结果
     if mius == 1 {
         return -res
     }
     return res
 }

代码

results matching ""

    No results matching ""