LeetCode 7. 整数反转(易)
记录了Python位运算的基本操作
题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [\(−2^{31}\), \(2^{31}-1\)]。请根据这个假设,如果反转后整数溢出那么就返回 0。
示例
示例 1:
1 |
|
示例 2:
1 |
|
示例 3:
1 |
|
考察知识点
数组、位移运算、边界条件
核心思想
针对优化解 可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。反转整数的方法可以与反转字符串进行类比。我们想重复“弹出” x 的最后一位数字,并将它“推入”到 res 的后面。最后,res 将与 x 相反。
Python版本
输入输出都必须要检测是否越界
关键一行
1 |
|
自己手写的一个版本
1 |
|
提交结果 | 执行用时 | 内存消耗 | 语言 |
---|---|---|---|
通过 | 32 ms | 13.1 MB | Python3 |
自己手写的版本
基于将int转成字符串,字符串反转的方式。
1 |
|
提交结果 | 执行用时 | 内存消耗 | 语言 |
---|---|---|---|
通过 | 44 ms | 13.2 MB | Python3 |
一个更加简洁、高效的优化版本
1 |
|
提交结果 | 执行用时 | 内存消耗 | 语言 |
---|---|---|---|
通过 | 40 ms | 12.9 MB | Python3 |
时间复杂度:\(O(log(x))\),\(x\)中大约有\(log10(x)\) 位数字。 空间复杂度:\(O(1)\)
有效语法糖
python的位运算符
a 为 60,b 为 13,二进制格式如下:a = 0011 1100; b = 0000 1101。
- (a & b) 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 输出结果 12 ,二进制解释: 0000 1100
- (a | b) 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 输出结果 61 ,二进制解释: 0011 1101
- (a ^ b) 按位异或运算符:当两对应的二进位相异时,结果为1 输出结果 49 ,二进制解释: 0011 0001
- (~a ) 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。
- a << 2 等价于 \(a \times 2^2\) 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。
1 |
|
输出结果 240 ,二进制解释: 1111 (15) 右移四位得到11110000(240)
- a >> 2 等价于 \(a \div 2^2\) 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数 输出结果 15 ,二进制解释: 0000 1111
python赋值运算符
= 乘法赋值运算符 c = a 等效于 c = c * a /= 除法赋值运算符 c /= a 等效于 c = c / a %= 取模赋值运算符 c %= a 等效于 c = c % a **= 幂赋值运算符 c **= a 等效于 c = c ** a //= 取整除赋值运算符 c //= a 等效于 c = c // a
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!