美文网首页
Python小白 Leetcode刷题历程 No.6-No

Python小白 Leetcode刷题历程 No.6-No

作者: _LanXiu | 来源:发表于2020-01-29 00:59 被阅读0次

    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
               
    

    或许有用的知识点:
    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题‘或许有用的知识点’中写出。

    相关文章

      网友评论

          本文标题:Python小白 Leetcode刷题历程 No.6-No

          本文链接:https://www.haomeiwen.com/subject/gkhvthtx.html