力扣学习笔记 day2

题007

题意

给定一个32位的有符号整数,将这个整数所有位上的数字进行反转

提示

  • -2^31 <= x <= 2^31 - 1

解题思路

本题思路比较简单:

  1. 将数字转化为字符串
  2. 判断第一位是否为负号:
    1. 正数:整个字符串翻转
    2. 负数:第二位开始进行翻转
  3. 翻转后加上符号,用int转换类型后输出
  4. 输出时需要考虑32位这个限定条件,即大于-2147483648,小于2147483647

代码

def reverse(self,x: int)->int:
	m=str(x)
	res=0
	if m[0]=='-':#若为负数
		res=int('-'+m[1:][::-1])
	else:
		res=int(m[::-1])
	return res if -2147483648<res<2147483647 else 0

题008

题意

将一个字符串转化为整数

  • 字符串前面的空格需要丢弃
    -若第一个非空字符是数字,从它开始取尽可能多的连续数字字符,组成一个整数
  • 若第一个非空字符为正负号,从它开始操作同上,组成一个有符号整数
  • 有效的整数字符以外的字符可以被忽略
  • 若字符串为空,或者第一个字符不满足上述要求,则返回0

注意

  • 数值范围限定在 -2^31 <= x <= 2^31 - 1,若超出这个范围,就输出边缘值

eg

输入: “42”
输出: 42

输入: " -42"
输出: -42

输入: “4193 with words”
输出: 4193

输入: “words and 987”
输出: 0

输入: “-91283472332”
输出: -2147483648


解题思路

法一

根据优秀题解,学习正则表示式的使用方法:

^:匹配字符串开头
[\+\-]:表示一个+字符 或者 -字符
?:表示前面的一个字符可有可无(此处指+-符号)
\d:一个数字
+:前面一个字符的一个或多个(此处指一个或多个数字)
\D:一个非数字字符
*:前面一个字符的0个或多个

整体的正则表示式为:^[\+\-]?\d+

拆开讲解:
[+-]? 可能有正负符号
\d+ 一个或多个数字

**一行代码 **

# lstrip() 方法用于截掉字符串左边的空格或指定字符
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31-1), -2**31)

逐行写

def myAtoi(self,s:str)->int:
	str=s.lstrip()
	num_re=re.compile(r'^[\+\-]?\d+') #设置正则的规则
	num=num_re.findall(str) #进行匹配
	num=int(*num) #转换为整数
	return max(min(num, 2**31-1),-2**31)

法二

最简单的解法,建立一个字典,将字符对应到数字,然后依次匹配,计算答案。

def myAtoi(self,s:str)->int:
	d={
     '0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
	s=s.lstrip()#去除空格
	flag=1
	res=0
	if len(s)<1:
		return 0
	#判断最前面是否为正负号,如有符号,去除第一位
	if s[0]=='-':
		flag=-1
		s=s[1:]
	elif s[0]=='+':
		s=s[1:]
	i=0
	while i <len(s) and s[i] in d:
		res=res*10+d[s[i]]
		i+=1
	res*=flag
	return max(min(res,2**31-1),-2**31)

题009

题意

判断一个整数是否为回文数

解题思路

  1. 若转化为字符串
def isPalindrome(self, x: int) -> bool:
	t=str(x)
	return t==t[::-1]
  1. 不转化为字符串

将该数不断除以10,从而产生一个反转的int整数,达到不转化为字符串的要求。

def isPalindrome(self, x: int) -> bool:
	y=abs(x)
	res=0
	while y>0:
		res=res*10+y%10
		y//=10
	return res==x

你可能感兴趣的:(力扣)