DW&LeetCode_day4(1018、16、20、21)

DW&LeetCode_day4(1018、16、20、21)


写在前面:

  • 开始第4天的内容啦!各位小伙伴加油哦!

开源内容

开源内容

学习大纲 


目录

DW&LeetCode_day4(1018、16、20、21)

写在前面:

开源内容

学习大纲 

1018. 可被 5 整除的二进制前缀

题解:

16. 最接近的三数之和

题解:

20. 有效的括号

题解:

21. 合并两个有序链表

题解:


1018. 可被 5 整除的二进制前缀

给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。

返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。

 

示例 1:

输入:[0,1,1]
输出:[true,false,false]
解释:
输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为真。

示例 2:

输入:[1,1,1]
输出:[false,false,false]


示例 3:

输入:[0,1,1,1,1,1]
输出:[true,false,false,false,true,false]


示例 4:

输入:[1,1,1,0,1]
输出:[false,false,false,false,false]
 

提示:

1 <= A.length <= 30000
A[i] 为 0 或 1

链接:题目链接

题解:

class Solution:
    def prefixesDivBy5(self, A: List[int]) -> List[bool]:
        a = []
        b = 0
        for i in A:
            b = (b * 2 + i)% 5 #将前面的数乘2,再加上新增数并对5取余
            if b  == 0:
                a+=True
            else:
                a+=False
        return a

DW&LeetCode_day4(1018、16、20、21)_第1张图片

16. 最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

 

示例:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
 

提示:

3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4


链接:题目链接

题解:

# python 双指针加排序
class Solution:
    def threeSumClosest(self, a: List[int], target: int) -> int:
        a.sort()
        res = float('inf')
        for i in range(len(a)):
            if i == 0 or a[i]>a[i-1]:                 # 去重
                left = i+1
                right = len(a)-1
                while left

DW&LeetCode_day4(1018、16、20、21)_第2张图片

20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true


示例 2:

输入: "()[]{}"
输出: true


示例 3:

输入: "(]"
输出: false


示例 4:

输入: "([)]"
输出: false


示例 5:

输入: "{[]}"
输出: true


链接:题目链接

题解:

       # python 语法糖
        while '{}' in s or '()' in s or '[]' in s:
            s = s.replace('{}', '')
            s = s.replace('[]', '')
            s = s.replace('()', '')
        return s == ''

DW&LeetCode_day4(1018、16、20、21)_第3张图片

21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

 

示例 1:

 

DW&LeetCode_day4(1018、16、20、21)_第4张图片


输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]


示例 2:

输入:l1 = [], l2 = []
输出:[]


示例 3:

输入:l1 = [], l2 = [0]
输出:[0]


链接:题目链接

题解:

# 一个详细的思路 --alex
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        #创建一个新的链表
        res = ListNode(0)
        #一个指针指向新的链表的头部
        c1 = res
        #开始比较L1和l2的值,只要有一个走完就停
        while(l1 and l2):
            #如果l1的值小于等于l2的值,则加入新的链表同时移动L1
            if l1.val<=l2.val:
                c1.next = ListNode(l1.val)
                l1 = l1.next
                c1 = c1.next
            #反之则添加l2的值,同时移动l2
            else l1.val>l2.val:
                c1.next = ListNode(l2.val)
                l2= l2.next
                c1 =c1.next
        #检查L1和l2哪个没走完,则将后面的直接加入新的链表即可
        if l1:
            c1.next = l1
        if l2:
            c1.next  = l2
        #返回头部的下一个即可
        return res.next

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if not l1 : return l2    #终止条件
        if not l2 : return l1
        if l1.val <= l2.val :    #递归条件
           return ListNode(l1.val, self.mergeTwoLists(l1.next, l2))
        else:
           return ListNode(l2.val, self.mergeTwoLists(l1, l2.next))

DW&LeetCode_day4(1018、16、20、21)_第5张图片

 

 

 

 

 

你可能感兴趣的:(Datawhale,LeetCode题解,leetcode)