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 字形变换

难度:中等
题目描述:
在这里插入图片描述

题解代码(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.整数反转

难度:简单
题目描述:

在这里插入图片描述

题解代码(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 x<-2147483648 or x>2147483647:
            return 0
        return x
        

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

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

难度:中等
题目描述:

在这里插入图片描述在这里插入图片描述

题解代码(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
           

或许有用的知识点:
Python中 [a**n]=a^n为a的n次方
re.findall 的简单用法(返回string中所有与pattern相匹配的全部字串,返回形式为数组)
str.lstrip([chars])用于截掉字符串左边的所有chars,s.lstrip()是去掉s左边所有的空格,
因此re.findall()中返回一个list其中包含所有能findout的元素,显然,本处list只有一个元素,
我们用*re.findall()对这个list拆包,得到这个list中唯一的元素,再转换成int形式,
其他的根据下图都很容易明白。

在这里插入图片描述

解题思路:
这个题真的是烦死我我了,要考虑的情况太多了,经常有答案不通过才发现题干隐藏这别的要求。我用的是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.回文数

难度:简单
题目描述:

在这里插入图片描述

题解代码(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。

在这里插入图片描述

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

No.10.正则表达式匹配

难度:困难
题目描述:

在这里插入图片描述

在这里插入图片描述

题解代码(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、付费专栏及课程。

余额充值