以下为我的天梯积分规则:
每日至少一题:一题积分+10分
若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)
若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)
初始分为100分
若差一天没做题,则扣积分-10分(周六、周日除外注:休息)
坚持!!!
初级算法
刷题目录
字符串
题干
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [− 2 31 −2^{31}−2
31
, 2 31 2^{31}2
31
− 1] ,就返回 0。
示例1:
输入:x = 123
输出:321
示例2:
输入:x = -123
输出:-321
示例3:
输入:x = 120
输出:21
示例4:
输入:x = 0
输出:0
暴力反转
分析:
我们的数字长度可能超过32位,也可能不超过,则设置两个条件;由于是有符号的数,那我们符号得保留下来,仅对数字进行反转,符号不变。
我们可以将数字转换为字符串单个字符放在数组里面,然后再进行上一题的转换,这样就没毛病了。
class Solution: def reverse(self, x: int) -> int: t = list(str(x)) # 将数字转换成字符数组 # t = list(map(str, str(x))) n = len(t) left = n-1 right = 1 right2 = 0 if t[0] == '-': for i in range((n-1)//2): t[right], t[left] = t[left], t[right] right += 1 left -= 1 tt = int(''.join(t)) if tt <= (2**31-1) and tt >= (-2**31): return tt else: return 0 else: if n == 1: return x else: for j in range(n//2): t[right2], t[left] = t[left], t[right2] right2 += 1 left -= 1 tt = int(''.join(t)) if tt<= (2**31-1) and tt >= (-2**31): return tt else: return 0
感觉这个办法很笨,也很慢,我们还需要再优化优化
直接反转
数字嘛,我们针对数字那就直接反转,个位十位百位千位嘛,就是系数乘以10的倍数呗、我们只需要将个位变为最高位,十位变为第二高位,以此类推,这样会快一些。首先判断是否为0,否则返回0.还得判断是否为负数,如果为负数则先统一为正,然后再添上符号。
引用一下大佬的图片
class Solution: def reverse(self, x: int) -> int: flag = False # 设置标识符 if x < 0: # 判断正负 flag = True x = abs(x) # 绝对值化 res = 0 # 设置初值 while x != 0: res *= 10 # 加权移位 temp = x % 10 # 取余 x //= 10 # 地板除 res += temp # 赋值 if flag: # 回归负 res = 0 - res if res < 0 - 2 ** 31: return 0 if res > 2 ** 31 - 1: # 正值 return 0 return res