LeetCode 007 Python&Go版本

点击上方“Python学习开发”,选择“加为星标

第一时间关注Python技术干货!

LeetCode 007 Python&Go版本_第1张图片

题目名称:整数反转

题目要求:

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

示例 1:
输入: 123
输出: 321

示例 2:
输入: -123
输出: -321

示例 3:
输入: 120
输出: 21
注意:

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

解题思路

谈到反转数字应该能想到

res =res*10+x%10
x //= 10

res默认为0,x表示传入的数字。这个式子需要计算多次。
首先看x%10,我们知道%的作用是取余数,其实这里就是倒着取x每位的数。
x //= 10,//表示的取整,这里就是正着取x剩下的数。
举个例子

x=123 
x%10 =3
x//10 = 12
x%10 = 2
x//10 = 1
x%10 = 1
x//10 = 0

这样就倒着把数取完了,剩下的就是将这些数字拼接了。

接下来看整个式子。

res =0
res = res\*10 + x%10
x//=10
第一次计算得到res = 0\*10+3 = 3,x//=10,此时x为12
接下来继续计算res = 3\*10+2 = 32,x//=10,此时x为1
res = 32\*10+1 =321,此时x//=10,x为0.停止计算。

这些东西,可能看不太懂,多看看下面代码应该就懂了。
取反包括后面的回文数都用到类似的计算。

代码

Python Version

"""
python的负数取模会得到一个正数。
"/"  表示浮点数除法,返回浮点结果;
"//" 表示整数除法,返回不大于结果的一个最大的整数
"""

class Solution:
    def reverse(self, x: int) -> int:
        y, res = abs(x), 0
        #因为x的范围在[-2^31,2^31-1],所以如果x为负数时,其绝对值对应的范围就是1 << 31
        #y的位数不断弹出,压入res。
        of = (1 << 31) - 1 if x > 0 else 1 << 31
        while y != 0:
            res = res * 10 + y % 10 
            if res > of: return 0
            y //= 10
        return res if x > 0 else -res

if __name__ == "__main__":
    s = Solution()
    print(s.reverse(-231))
    # l =[1,0,123,320,-231,1534236469]
    # for item in l:
    #     print(s.reverse(item))   

在Python中如果对负数整除会发现结果为正的,所以这就是为什么在计算前先取了x的绝对值,然后最后再调整结果的正负号,下面的go版本就没这个问题。


Go Version

package main
import "fmt"
func reverse(x int) int {
        res:=0
        for x!=0{
            res =res*10+x%10
            if ((-1<<31) >= x || x>=(1<<31-1)) {
                return 0

            }
            x/=10
        }
        return res
}

func main() {
    x:=[]int{1,123,0,321,-1241441}
    for _,v:=range x{
        fmt.Println(reverse(v))
    }

}

推荐阅读

Python 爬虫面试题 170 道:2019 版

LeetCode-001  Python&Go版本

添加微信[gopython3].回复:回复Go或者Python加对应技术群。

你可能感兴趣的:(LeetCode 007 Python&Go版本)