leetcode字符串转数字c语言,Python小白 Leetcode刷题历程 No.6-No.10 Z 字形变换、整数反转、字符串转换整数 (atoi)、回文数、正则表达式匹配(有题干 ...

Python小白 Leetcode刷题历程 No.6-No.10 Z 字形变换、整数反转、字符串转换整数 (atoi)、回文数、正则表达式匹配

写在前面:

作为一个计算机院的大学生,总觉得仅仅在学校粗略的学习计算机专业课是不够的,尤其是假期大量的空档期,作为一个小白,实习也莫得路子,又不想白白耗费时间。于是选择了Leetcode这个平台来刷题库。编程我只学过基础的C语言,现在在自学Python,所以用Python3.8刷题库。现在我Python掌握的还不是很熟练,算法什么的也还没学,就先不考虑算法上的优化了,单纯以解题为目的,复杂程度什么的以后有时间再优化。计划顺序五个题写一篇日志,希望其他初学编程的人起到一些帮助,写算是对自己学习历程的一个见证了吧。

有一起刷LeetCode的可以关注我一下,我会一直发LeetCode题库Python3解法的,也可以一起探讨。

觉得有用的话可以点赞关注下哦,谢谢大家!

········································································································································································

题解框架:

1.题目,难度

2.题干,题目描述

3.题解代码(Python3(不是Python,是Python3))

4.或许有用的知识点(不一定有)

5.解题思路

6.优解代码及分析(当我发现有比我写的好很多的代码和思路我就会写在这里)

········································································································································································

No.6.Z 字形变换

难度:中等

题目描述:

045d9b853852

在这里插入图片描述

题解代码(Python3.8)

class Solution(object):

def convert(self, s, numRows):

if numRows<2:

return s

res=["" for i in range(numRows)]

j,flag = 0,-1

for ch in s:

res[j] += ch

if j == 0 or j == numRows-1 :

flag=-flag

j += flag

return "".join(res)

解题思路:

这个题,其实就是输入一个字符串,再输入一个数字n,创建n个字符串,将输入的字符串中的字符,依次输入进str[1]到str[n]再倒着输入回str[1]如此反复,最后输出str[1]+str[2]+……+str[n]。

实际操作中,我们先通过res=["" for i in range(numRows)]创建n个字符串(“”是空str,[]是空list),再控制字符串循环输入到n个字符串中,最后用 return "".join(res)将n的字符串相连输出。

No.7.整数反转

难度:简单

题目描述:

045d9b853852

在这里插入图片描述

题解代码(Python3.8)

class Solution(object):

def reverse(self, x):

flag=0

if x<0:

flag=1

x=-x

x=str(x)

x=x[::-1]

x=int(x)

if flag == 1:

x=-x

if x2147483647:

return 0

return x

解题思路:

设置一个flag记录正负,先把x变为非负整数,将x转换为str形式,运用切片的操作将字符串反转,再还原成int形式,赋予正负号,判断是否满足条件输出即可。Python切片操作具体内容我在第9题‘或许有用的知识点’中写出。

No.8.字符串转换整数 (atoi)

难度:中等

题目描述:

045d9b853852

在这里插入图片描述

045d9b853852

在这里插入图片描述

题解代码(Python3.8)

class Solution(object):

def myAtoi(self, s):

flag=0

l=len(s)

for i in range(l):

if s[i]==' ' or s[i]=='+' or s[i]=='-':

continue

if '0' <= s[i] <= '9':

flag=1

break

else:

break

if flag ==1:

flag1=0

flag2=0

for i in range(l):

if not( '0' <= s[i] <= '9' ): #不是数字

if (s[i]=='+' or s[i]=='-')and(flag1==0): #正负号

if flag2==1:

s=s[:i]

break

flag1 =flag1+1

if (s[i+1]=='+' or s[i+1]=='-' or s[i+1]==' ')and(flag1==1):

s=0

break

continue

if (s[i]=='+' or s[i]=='-')and(flag1==1):

s=s[:i]

break

else: #空格

if flag2==1:

s=s[:i]

break

else: #是数字

flag2=1

s=int(s)

if -2147483648 <= s <= 2147483647:

return s

if s < -2147483648:

return -2147483648

if s > 2147483647:

return 2147483647

else:

return 0

或许有用的知识点:

re.findall 的简单用法(返回string中所有与pattern相匹配的全部字串,返回形式为数组)

str.lstrip([chars])用于截掉字符串左边的所有chars,s.lstrip()是去掉s左边所有的空格,

因此re.findall()中返回一个list其中包含所有能findout的元素,显然,本处list只有一个元素,

我们用re.findall()对这个list拆包,得到这个list中唯一的元素,再转换成int形式,

其他的根据下图都很容易明白。*

045d9b853852

在这里插入图片描述

解题思路:

这个题真的是烦死我我了,要考虑的情况太多了,经常有答案不通过才发现题干隐藏这别的要求。我用的是for循环遍历判断的方法,十分麻烦,这个题用Python的话强推正则表达式,一行,就一行,就解决了我麻烦了我半个钟头的题,python的正则表达相关内容我在本题‘或许有用的知识点’中写出。

优解代码及分析:

优解代码(Python3.8)

class Solution:

def myAtoi(self, str: str) -> int:

return min(max(-(2**31),int(*re.findall('^[\+\-]?\d+',str.lstrip()))),2**31-1)

## min max 的判断; 由一个+-和多个数字组成; 消除前端空格

分析:

运用了正则表达式,python的正则表达相关内容我在本题‘或许有用的知识点’中写出。

No.9.回文数

难度:简单

题目描述:

045d9b853852

在这里插入图片描述

题解代码(Python3.8)

class Solution(object):

def isPalindrome(self, x):

x=str(x)

return x == x[::-1]

或许有用的知识点:

切片操作:通常一个切片操作要提供三个参数 [start_index: stop_index: step] :

start_index是切片的起始位置

stop_index是切片的结束位置(不包括)

step可以不提供,默认值是1,步长值不能为0,不然会报错ValueError。

045d9b853852

在这里插入图片描述

解题思路:

这道题就体现Python切片功能的强大了,先把int型的x转换为str型,然后对x反向切片看与原来x是否相等,返回判断的布尔值。

No.10.正则表达式匹配

难度:困难

题目描述:

045d9b853852

在这里插入图片描述

045d9b853852

在这里插入图片描述

题解代码(Python3.8)

class Solution(object):

def isMatch(self, s, p):

return True if re.match('^'+str(p)+'$',s) else False

题解思路:

这题我偷懒了,如果想锻炼算法的话应该用动态规划慢慢做。我是想着正好再前几个题中学到了Python的正则表达式,就在这里用了一下,算是偷懒了。python的正则表达相关内容我在第8题‘或许有用的知识点’中写出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值