LeetCode做题记录

题库-力扣

2.两数相加

https://leetcode-cn.com/problems/add-two-numbers/
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

  1. 思路:
    题中涉及的运算是数值相加,数据输入和输出都是以链表形式存在的,每个节点存放的是一位数字,数字的位数是按照逆序的方式存储的,因此可以考虑以计算加法竖式的思路来解决本题。
    先构建一个链表用于存放输出值,当前节点存放的是个位数的值,后续节点存放的是更高位数的值。先将输入值的当前节点进行相加,和的个位数存放在输出链表的当前节点,十位数用于计算输出链表下一个节点的值;接下来就按照同样的思路计算下一个节点,在求节点和的时候要加上上一节点和的十位数;如此迭代直至两个输入链表的节点均穷尽,当仅有一个链表穷尽时可以给该链表补0值。当两个数最高位数的和是大于9时需要再增加一个数字的位数用于存放和的十位数。即当两个链表最后一次的和为两位数时,将其十位数存放在输出链表的下一个节点中。

  2. 代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        re = ListNode(0)
        r=re
        carry=0
        while(l1 or l2):
            x= l1.val if l1 else 0
            y= l2.val if l2 else 0
            s=carry+x+y
            carry=s//10
            r.next=ListNode(s%10)
            r=r.next
            if(l1!=None):l1=l1.next
            if(l2!=None):l2=l2.next
        if(carry>0):
            r.next=ListNode(1)
        return re.next   #re的结构和r第一个节点的结构是一样的
    

22.括号生成

https://leetcode-cn.com/problems/generate-parentheses/submissions/
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

  1. 思路:
    (一)
    对于这个问题我的思路相对较为繁琐:先生成所有种类的括号排序,再依据从起始位置开始截取,左括号数必须大于等于右括号数,且整体的左括号数与右括号数相等这样的规则选取其中符合要求的排列方式。但这样当n较大时,所要消耗的内存会很大。
    (二)
    在知乎上看到一种解决的方法“回溯法”:只有在我们知道序列仍然保持有效时才添加 ‘(’ or ‘)’,而不是像方法一那样每次添加。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。
  2. 代码:
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        ans = []
        def backtrack(S = '', left = 0, right = 0):
            if len(S) == 2 * n:
                ans.append(S)
                return
            if left < n:
                backtrack(S+'(', left+1, right)
            if right < left:
                backtrack(S+')', left, right+1)

        backtrack()
        return ans

91. 解码方法

https://leetcode-cn.com/problems/decode-ways/submissions/
一条包含字母 A-Z 的消息通过以下方式进行了编码:

‘A’ -> 1
‘B’ -> 2

‘Z’ -> 26

给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:

输入: “12”
输出: 2
解释: 它可以解码为 “AB”(1 2)或者 “L”(12)。

示例 2:

输入: “226”
输出: 3
解释: 它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。

  1. 思路:
    可以看作一个动态规划的问题,
    (一)首先,如果第一位上是0,那么无法转码,返回0;
    (二)其次,每次转码,都可以看看第i位跟第i-1位的数字是否小于等于26,如果符合的话,我们在i-2位上解码;如果第i位不等于0的话,说明我们相当于在第i-1位上解码。如果两个都符合,相当于:dp[i] = dp[i-1] + dp[i-2];

  2. 代码:

class Solution:
    def numDecodings(self, s: str) -> int:
        s = '0' + s
        length = len(s)
        dp = [1] * (length)

        for i in range(1, length):
            c = 0
            single = s[i]  # 一位数
            if single != '0':
                c += dp[i - 1]
            double = s[i - 1:i + 1]  # 两位数
            if (not double.startswith('0')) and 0 < int(double) < 27:
                c += dp[i - 2]
            dp[i] = c
        return dp[-1]

这种题我不会做,是看的一篇博客上的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值