1.整数反转
这题让我学到了整数溢出的知识,查阅了资料https://blog.csdn.net/weixin_45722061/article/details/102579358,其中提到
1 Python 3 中整数的上限是多少?Python 2 呢? 2 Numpy 中整数的上限是多少?出现整数溢出该怎么办? 3 关于第一个问题,先看看 Python 2,它有两种整数: 4 5 一种是短整数,也即常说的整数,用 int 表示,有个内置函数 int()。其大小有限,可通过sys.maxint() 查看(取决于平台是 32 位还是 64 位) 6 一种是长整数,即大小无限的整数,用 long 表示,有个内置函数 long()。写法上是在数字后面加大写字母 L 或小写的 l,如 1000L 7 当一个整数超出短整数范围时,它会自动采用长整数表示。举例,打印 2**100 ,结果会在末尾加字母 L 表示它是长整数。 8 9 但是到了 Python 3,情况就不同了:它仅有一种内置的整数,表示为 int,形式上是 Python 2 的短整数,但实际上它能表示的范围无限,行为上更像是长整数。无论多大的数,结尾都不需要字母 L 来作区分。 10 11 也就是说,Python 3 整合了两种整数表示法,用户不再需要自行区分,全交给底层按需处理。 12 13 理论上,Python 3 中的整数没有上限(只要不超出内存空间)。这就解释了前文中直接打印两数相乘,为什么结果会正确了。 14 15 回到前面的第二个话题:Numpy 中整数的上限是多少? 16 17 由于它是 C 语言实现,在整数表示上,用的是 C 语言的规则,也就是会区分整数和长整数。 18 19 也就是说它默认的整数 int 是 32 位,表示范围在 -2147483648 ~ 2147483647。 20 21 对照前文的截图,里面只有两组数字相乘时没有溢出:100007*4549、100012*13264,其它数据组都溢出了,所以出现奇怪的负数结果。
综上所述,python中没有整数溢出问题,发现了python的一处强大之处
不过题目假设我们的环境只能存储得下 32 位的有符号整数,所以还是要对其进行判断的
在leetcode上看到了好多种解法和思路,感觉对自己的帮助很大,目前自己对算法题感觉还停留在暴力解/效率很低的解法层面,感觉得多看看leetcode高质量的代码及解法
又学到了python的三元表达式
variable = a if exper else b
还学到了python中 -123 // 10 答案是13,-123 % 10 答案是7
http://blog.sina.com.cn/s/blog_6a6c136d0101iukq.html中提到
python是向下取整而不是C/C++,Java的向零取整
可以看到python的除法和取模操作和其他语言都不一样
1 class Solution(object): 2 def reverse(self, x): 3 """ 4 :type x: int 5 :rtype: int 6 """ 7 INT_MAX = 2**31 -1 8 INT_MIN = -(2**31) 9 res = 0 10 while x != 0: 11 pop = x % 10 if x > 0 else (x % 10 - 10 if x % 10 != 0 else x % 10) # (x > 0)?(x % 10):(10 - x%10) 12 x = x // 10 if x > 0 else (x // 10 + 1 if x % 10 != 0 else x // 10) 13 if res > INT_MAX // 10 or (res == INT_MAX // 10 and pop > 7): 14 return 0 15 if res < INT_MIN // 10 + 1 or (res == INT_MIN // 10 + 1 and pop < -8): 16 return 0 17 res = res * 10 + pop 18 return res
2.