- 第一天的内容已经打卡完成,看到大家的新思路,突然就清晰了,开始第二天的内容啦!各位小伙伴加油哦!
开源内容
DW&LeetCode_day2(7、8、9)
写在前面:
开源内容
学习大纲
7. 整数反转
python 的位运算符:
python 赋值运算符:
8. 字符串转换整数 (atoi)
解释正则表达式
9. 回文数
写在最后:
20天,每天平均花费时间2小时-5小时不等,根据个人学习接受能力强弱有所浮动。
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
示例 1:
输入:x = 123
输出:321
示例 2:输入:x = -123
输出:-321
示例 3:输入:x = 120
输出:21
示例 4:输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
链接:题目链接
python 的位运算符:
(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
左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补 0。
输出结果 240 ,二进制解释: 1111 0000a >> 2
右移动运算符:把 ">>" 左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
输出结果 15 ,二进制解释: 0000 1111python 赋值运算符:
*= 乘法赋值运算符 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
注意:
python中 取摸 取整除 需要注意 和java不一样
python 中 -1%10 = 9 , -1//10=-1 java 中 -1%10 = 1 , -1//10=0
题解:
def reverse(self, x: int) -> int: sign = x >= 0 # 判断x正负 maxInt32 = (1 << 31) - 1 # 初始化int32最大值 res = 0 # 初始化为0 if x == - 1 << 31: return 0 # 若x为负int32最小值,则反转后必定溢出,其余负数情况和正数是对称的 x = abs(x) # 将x转为正数来处理 while x != 0: # 只要还没有结束pop pop = x % 10 # 最后一位为x的pop x //= 10 # 这时去掉最后一位 if res > maxInt32 // 10 or res == maxInt32 // 10 and pop > 7: return 0 # 当result已经大于最大值//10,或者等于int32最大值//10并且当前pop出的值大于7时,必定溢出,返回0 # 如果不溢出,则把pop出的值加进result中 res = res * 10 + pop # 最后返回带正负号的result return res if sign else -res
# 字符串切片处理 class Solution: def reverse(self, x): if x >= 0: x = int(str(x)[::-1]) else: x = -int(str(x)[1:][::-1]) return x if x >=2147483647 or x <= -2147483648 else 0
class Solution: def reverse(self, x): r = x // max(1, abs(x)) * int(str(abs(x))[::-1]) #0:x为0, 1:x为正, -1:x为负,再进行序列反转 return r if r.bit_length() < 32 or r == -2**31 else 0 #2^31 和 -2^31 的比特数为32,其中正负号占用了一位
class Solution: def reverse(self, x: int) -> int: return (x//abs(x) * int(str(abs(x))[::-1])if x else 0) if -1<<31 < (x//abs(x) * int(str(abs(x))[::-1])if x else 0) < (1<<31)-1 else 0 # int(str(abs(x))[::-1]) 这句可以输出 x 的无符号的反转,先把整数转字符串,在把字符串反转,再把字符串转整数 # x = x//max(1, abs(x)) * int(str(abs(x))[::-1])溢出则返回0 # x//abs(x) 用于得到 x 的符号,但是对 0 不适用,所以得加 if else 表达式判断一下 # int((x+0.1)//abs(x+0.1)) 用于得到 x 的符号,由于 x 是整数,加个 0.1 不会改变符号,并解决了除 0 的问题 # 最后使用 if else 表达式判断范围是否在 int32 内
# 极简解法 return (int(str(abs(x))[::-1])*(-1 if x < 0 else 1)) if -2**31 <= (int(str(abs(x))[::-1])*(-1 if x < 0 else 1)) <= 2**31-1 else 0
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
- 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
- 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
- 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
注意:
- 本题中的空白字符只包括空格字符 ' ' 。
- 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 231 − 1 或 −231 。
链接:题目链接
示例 1:
输入: "42"
输出: 42
示例 2:输入: " -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
示例 4:输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
因此无法执行有效的转换。
示例 5:输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。
提示:
0 <= s.length <= 200
s 由英文字母(大写和小写)、数字、' '、'+'、'-' 和 '.' 组成
解释正则表达式
^[\\+\\-]?\\d+ ^ 表示匹配字符串开头,我们匹配的就是 '+' '-' 号 [] 表示匹配包含的任一字符,比如[0-9]就是匹配数字字符 0 - 9 中的一个 ? 表示前面一个字符出现零次或者一次,这里用 ? 是因为 '+' 号可以省略 \\d 表示一个数字 0 - 9 范围 + 表示前面一个字符出现一次或者多次,\\d+ 合一起就能匹配一连串数字了
# TS解法 function myAtoi(str: string): number { const MAX = 2 ** 31 - 1; const MIN = -(2 ** 31); // 与之后面尽可能多的连续数字字符组合起来 if (Number.isNaN(parseInt(str))) { return 0; } else { let res = parseInt(str); if (res > MAX) { return MAX; } else if (res < MIN) { return MIN; } else { return res; } } }; // 在 parseInt 转换失败的基础上加一个处理,与之后面尽可能多的连续数字字符组合起来
要注意,Golang 中的
:=
叫短变量声明,意思是声明并初始化,它和 Python 中的:=
不是一个概念# python解法 return min(max(int(x.group(0)) if (x:=re.match("[ ]*[\+\-]?\d+",str)) else 0 ,y:=-2**31),-y-1) # 正则表达式和Assignment Expressions运算符
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:你能不将整数转为字符串来解决这个问题吗?
链接:题目链接
# python 解法 def isPalindrome(self,x:int)->bool: a = str(x) b = (len(a))//2 return a[:b] == a[-1:-b-1:-1]
# 直接把数字转成字符串,然后直接比较字符串 # 因为Python中字符串可以看作是一个不可变的序列,因此可以使用切片 s[::-1] 将 s 翻转,然后判断即可 return (x >= 0) and (x == int(str(x)[::-1]))
"keep it simple & stupid","简洁胜于复杂,编程不是为了炫耀聪明和晦涩的语法,而是为了让你的代码可以清楚的表达它们的目的"