61 - 67 这周时间不多 每日一题做少了

61 旋转列表  

被大多数人击败  不想写题解

应该与我数了长度有关 

我想的是这样后面不用再遍历了 

很长时有利

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if k == 0:
            return head
        if head == None:
            return head
        header = ListNode(0,head)
        n = 0
        p = header
        q = header
        while p.next != None:
            n = n+1
            p = p.next
            if n > k:
                q = q.next
        if n > k:
            p.next = header.next
            header.next = q.next
            q.next = None
            return header.next
        k = k%(n)
        if k == 0 :
            return head
        n = 0
        p = header
        q = header
        while p.next != None:
            n = n+1
            p = p.next
            if n > k:
                q = q.next
        p.next = header.next
        header.next = q.next
        q.next = None
        return header.next

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/rotate-list/solution/bei-duo-shu-ren-ji-bai-bu-xiang-xie-ti-j-ef8m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

62:不同路径

简单的dp 简单的一天

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[0]*n for i in range(m)]
        for i in range(n):
            dp[m-1][i] = 1
        for i in range(m):
            dp[i][n-1] = 1
        for col in range(n-2,-1,-1):
            for row in range(m-2,-1,-1):
                dp[row][col] = dp[row+1][col] + dp[row][col+1]
        return dp[0][0]

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/unique-paths/solution/jian-dan-de-dp-jian-dan-de-yi-tian-by-yi-ypcr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

63:

障碍不同路径 跟上题没啥差别

遇到障礙就把障礙這裏變成0

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        dp = [[0]*n for i in range(m)]
        for i in range(n-1,-1,-1):
            if obstacleGrid[m-1][i] == 1:
                break
            dp[m-1][i] = 1
        for i in range(m-1,-1,-1):
            if obstacleGrid[i][n-1] == 1:
                break
            dp[i][n-1] = 1
        for col in range(n-2,-1,-1):
            for row in range(m-2,-1,-1):
                if obstacleGrid[row][col] == 1:
                    dp[row][col] = 0
                # elif dp[row+1][col] == 0 or  dp[row][col+1] == 0:
                #     dp[row][col] = 0
                else:
                    dp[row][col] = dp[row+1][col] + dp[row][col+1]
        return dp[0][0]


作者:yizhu-jia
链接:https://leetcode-cn.com/problems/unique-paths-ii/solution/jiu-shi-yu-dao-zhang-ai-jiu-ba-zhang-ai-twwhv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 64 最小路径和 

一个解法写三道题

又是被多数人击败的一天

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        m = len(grid)
        n = len(grid[0])
        dp = [[0]*n for i in range(m)]
        dp [m-1][n-1] = grid[m-1][n-1]
        for i in range(n-2,-1,-1):
            dp[m-1][i] = dp[m-1][i+1] + grid[m-1][i]
        for i in range(m-2,-1,-1):
            dp[i][n-1] = dp[i+1][n-1] + grid[i][n-1]
        for col in range(n-2,-1,-1):
            for row in range(m-2,-1,-1):
                    dp[row][col] = min(dp[row+1][col],dp[row][col+1])+grid[row][col]
        return dp[0][0]

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/minimum-path-sum/solution/yi-ge-jie-fa-xie-san-dao-ti-by-yizhu-jia-b82k/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

65 有效数字 

暴力解法 

先看是不是小数(这里整数也属于小数)
再看有没有e
有e看前面是不是小数 后面是不是整数

class Solution:
    def isNumber(self, s: str) -> bool:
        def isint(s1):          #看是不是整数 
            n = len(s1)
            if n == 0:           #0长不算整数
                return False
            if n == 1 and not s1[0].isnumeric():       #只有正负号 也不行
                return False
            flag = True
            if not (s1[0] == '+'
                    or s1[0] == '-'
                    or s1[0].isnumeric()):          #第一位必须是正负号数字中的一个
                flag = False
                return flag
            for each in s1[1:]:
                if not each.isnumeric():        #判断后面的 如果都是数字 就是整数
                    flag = False
                    break
            return flag
        def isdec(s2):            #判断是不是小数
            flag = 0
            for each in s2:
                if each.isnumeric():
                    flag =1
                    break                #必须存在一个数字才能是小数  全是符号不行 比如'.'  '+.'
            if not flag:
                return False
            if isint(s2):               #整数就是小数
                return True
            if '.' not in s2:        #不是整数 还没有小数点? 你是啥
                return False
            pos = s2.rfind('.')
            s21 = s2[0:pos]
            s22 = s2[pos+1:]              #拆成两部分
            if not isint(s21) and len(s21)>0 and s21 != '+' and s21 != '-':     
                return False   #如果 前半部分不是空且不是整数且不是正负号  不用看后面了  
            if  len(s22) == 0:           
                return True            #如果后半部分是空 也满足
            if  isint(s22) and s22[0].isnumeric():   #如果后半部分同时是不带正负号的整数  说明是小数
                return True
            return False
        #主函数
        if 'e' in s and 'E' in s:    #Ee都在 再见
            return False
        if isdec(s):        #是小数  就是有效的
            return True
        if 'e' in s:           #找到e或者E的位置 找不到就再见
            pos = s.rfind('e')
        elif 'E' in s:
            pos = s.rfind('E')
        else:
            return False
        s1 = s[0:pos]
        s2 = s[pos+1:]               分割两部分 前半部分是小数或者整数 后半部分是整数
        if isdec(s1) and isint(s2):
            return True
        return False


作者:yizhu-jia
链接:https://leetcode-cn.com/problems/valid-number/solution/bao-li-jie-fa-ji-bai-5cheng-ren-by-yizhu-3bvg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

66 加1

从后往前找到第一个不是9的 把他加一 如果全是9 就在第一位插入1 其他变0

 

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        i = len(digits)-1
        while i >= 0:
            if digits[i] != 9:
                digits[i] +=1
                return digits
            else:
                digits[i] = 0
            i -= 1
        digits.insert(0,1)
        return digits

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/plus-one/solution/cong-hou-wang-qian-zhao-dao-di-yi-ge-bu-1vk05/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

67  二进制求和 

暴力解

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        n1 = len(a)-1
        n2 = len(b)-1
        carry = 0
        rel = ''
        while n1 >= 0 or n2>=0:
            if n1 <0 :
                sum = int(b[n2]) +carry
            elif n2 <0:
                sum = int(a[n1]) +carry
            else:
                sum = int(a[n1])+int(b[n2]) +carry
            if sum == 0:
                rel += '0'
                carry = 0
            if sum == 1:
                rel += '1'
                carry = 0
            if sum == 2:
                rel += '0'
                carry = 1
            if sum == 3:
                rel += '1'
                carry = 1
            n1 -= 1
            n2 -= 1
        if carry == 1:
            rel += '1'
        return rel[::-1]

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/add-binary/solution/-by-yizhu-jia-kegx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2021-10-16 10:13  yi术家  阅读(46)  评论(0)    收藏  举报