题目:给出一个32位有符号整数,将这个整数中每位上的数字进行反转。若反转后整数溢出,则返回0。
    例:123->321 -123->-321

    题解:
    一、暴力法

    1. def reverse_force(self, x: int) -> int:
    2. if -10 < x < 10:
    3. return x
    4. str_x = str(x)
    5. if str_x[0] != "-":
    6. str_x = str_x[::-1]
    7. x = int(str_x)
    8. else:
    9. str_x = str_x[:0:-1]
    10. x = int(str_x)
    11. x = -x
    12. return x if -2147483648 < x < 2147483647 else 0
    13. 作者:boywithacoin_cn
    14. 链接:https://leetcode-cn.com/problems/reverse-integer/solution/pythondan-chu-he-tui-ru-shu-zi-yi-chu-qian-jin-xin/
    15. 来源:力扣(LeetCode
    16. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    知识点:
    list固定间隔抽取元素

    x=[1,2,3,4,5,6]
    
    x[start::step]
    

    例:抽取所有偶数索引的元素

    x[::2]=[1, 3, 5]
    x[0::2]=[1, 3, 5]
    

    例:抽取所有奇数索引的元素

    x[1::2]=[2, 4, 6]
    

    例:列表反转

    x[::-1]=[6, 5, 4, 3, 2, 1]
    x[::-2]=[6, 4, 2]
    

    注:列表反转本质上仍然是从list中按固定间隔抽取,只是起始位置和步长都设为-1所以反着取
    例:倒序取值

    x[1::-1]=[2, 1]
    x[0::-1]=[1]
    

    例:对某个索引之后的切片进行倒序取值

    x[:pivot:step]
    
    x[:0:-1]=[6, 5, 4, 3, 2]
    x[:0:-2]=[6, 4, 2]
    x[:0:-3]=[6, 3]
    x[:1:-1]=[6, 5, 4, 3]
    

    有符号数、无符号数、数据位宽
    有符号32位整型:No.7 整数反转 - 图1
    无符号32位整型:No.7 整数反转 - 图2
    No.7 整数反转 - 图3个位宽的二进制数共可以表达No.7 整数反转 - 图4种取值

    二、优化法

    def reverse_better(
            self, 
            x: int) -> int:
    
            y, res = abs(x), 0
            # 则其数值范围为 [−2^31,  2^31 − 1]
            boundry = (1<<31) -1 if x>0 else 1<<31
            while y != 0:
                res = res*10 +y%10
                if res > boundry :
                    return 0
                y //=10
            return res if x >0 else -res
    
    作者:boywithacoin_cn
    链接:https://leetcode-cn.com/problems/reverse-integer/solution/pythondan-chu-he-tui-ru-shu-zi-yi-chu-qian-jin-xin/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    知识点:
    移位运算

    1<<0=1=1
    1<<1=2=10
    1<<2=4=100
    3<<0=3=11
    3<<1=6=110
    3<<2=12=1100
    

    以此类推No.7 整数反转 - 图5,表示将二进制数1向左移位No.7 整数反转 - 图6次。并且每向左移一位,数值乘2。

    16>>0=16=10000
    16>>1=8=1000
    16>>2=4=100
    3>>0=3=11
    3>>1=1=1
    3>>2=0=0
    

    右移同理,并且每向左移一位,数值除以2,但右移后最低位会消失。

    十进制数中取某一段

    123%10=3
    123%100=23
    123%1000=123
    (123%100-123%10)//10=2#十位
    (123%1000-123%100)//100=1#百位
    

    以此类推,一个No.7 整数反转 - 图7位十进制整数的右No.7 整数反转 - 图8位=No.7 整数反转 - 图9
    一个No.7 整数反转 - 图10位十进制整数的右数第No.7 整数反转 - 图11位=No.7 整数反转 - 图12