1. 题目

Given a 32-bit signed integer, reverse digits of an integer.

Example 1:
Input: 123
Output: 321

Example 2:
Input: -123
Output: -321

Example 3:
Input: 120
Output: 21

Note:
Assume we are dealing with an environment which could only hold integers within the 32-bit signed integer range. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

2.分析

2.1 中文分析

反转Int,假设大小为32位,超过直接返回0。

2.2 解题思路

对int进行除10求余,进行循环,就可以逐个取出个、十、百、千……位上的数字。同时初始化一个结果值,不断将原数乘10并将取到的数字扔进来相加,最后可以获得反转后的数字。

3. 解答

一开始的解答:

func reverse(x int) int {
    var n int
    res := 0

    for x != 0 {
        n = x % 10
        x = x / 10
        res = res * 10 + n
    }

    // 超过32位存储范围直接返回0
    if res > 2147483647 || res < -2147483647 {
        return 0
    }

    return res
}

Runtime: 13 ms

上面的解法是正负不管直接处理,后来发现效率不加,于是进行优化,正负统一用正来处理最后再转化回来,最后的代码:

import "math"

func reverse(x int) int {
    var res int

    zf := true
    if x < 0 {
        zf = false
        x = x * -1
    }

    for x != 0 {
        res = res * 10 + x % 10
        x = x / 10
    }

    // 超过32位存储范围直接返回0
    if res > math.MaxInt32 || res < math.MinInt32 {
        return 0
    }

    if !zf {
        res = res * -1
    }

    return res
}

这个解的Runtime是 8 ms。