每日一练 — 2022.01.18


一,有效的括号

1,程序简介

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

示例 1:

  • 输入:s = “()”
  • 输出:true

示例 2:

  • 输入:s = “()[]{}”
  • 输出:true

示例 3:

  • 输入:s = “(]”
  • 输出:false

示例 4:

  • 输入:s = “([)]”
  • 输出:false

示例 5:

  • 输入:s = “{[]}”
  • 输出:true

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 ‘()[]{}’ 组成

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 18 21:02:21 2022
Function: 有效的括号
@author: 小梁aixj
"""
class Solution:
    def isValid(self, s: str) -> bool:
        parentheses = [
            '(', '[', '{',
            ')', ']', '}'
        ]
        i = 0
        sum = [0, 0, 0]
        top = []
        while i < len(s):
            c = s[i]
            j = 0
            while j <= 2:
                if c == parentheses[j]:
                    top.append(j)
                    sum[j] += 1
                elif c == parentheses[j+3]:
                    if len(top) == 0 or top[len(top)-1] != j:
                        return False
                    top.pop()
                    sum[j] -= 1
                j += 1
            i += 1
        if sum[0] != 0 or sum[1] != 0 or sum[2] != 0:
            return False
        else:
            return True
# %%
s = Solution()
print(s.isValid(s = "()[]{}"))
#true

3,运行结果

在这里插入图片描述

二,搜索旋转排序数组

1,程序简介

  • 整数数组 nums 按升序排列,数组中的值 互不相同 。

  • 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

  • 给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

示例 1:

  • 输入:nums = [4,5,6,7,0,1,2], target = 0
  • 输出:4

示例 2:

  • 输入:nums = [4,5,6,7,0,1,2], target = 3
  • 输出:-1

示例 3:

  • 输入:nums = [1], target = 0
  • 输出:-1

提示:

  • 1 < = n u m s . l e n g t h < = 5000 1 <= nums.length <= 5000 1<=nums.length<=5000
  • − 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^4 <= nums[i] <= 10^4 104<=nums[i]<=104
  • n u m s 中 的 每 个 值 都 独 一 无 二 nums 中的每个值都 独一无二 nums
  • 题 目 数 据 保 证 n u m s 在 预 先 未 知 的 某 个 下 标 上 进 行 了 旋 转 题目数据保证 nums 在预先未知的某个下标上进行了旋转 nums
  • − 1 0 4 < = t a r g e t < = 1 0 4 -10^4 <= target <= 10^4 104<=target<=104

进阶:

  • 你可以设计一个时间复杂度为 O(log n) 的解决方案吗?

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 18 21:03:44 2022
Function: 搜索旋转排序数组
@author: 小梁aixj
"""
class Solution:
    def search(self, nums, target):
        def get(start, end):
            if start > end:
                return -1
            mid = (start + end) / 2
            mid = int(mid)
            if nums[mid] == target:
                return mid
            elif nums[mid] >= nums[start]: 
                if target >= nums[start] and target < nums[mid]:
                    return get(start, mid - 1)
                else:
                    return get(mid + 1, end)
            elif nums[mid] <= nums[end]: 
                if target > nums[mid] and target <= nums[end]:
                    return get(mid + 1, end)
                else:
                    return get(start, mid - 1)
        return get(0, len(nums) - 1)
# %%
s = Solution()
print(s.search(nums = [4,5,6,7,0,1,2], target = 0))

3,运行结果

在这里插入图片描述

三,合并两个有序链表

1,程序简介

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 两 个 链 表 的 节 点 数 目 范 围 是 [ 0 , 50 ] 两个链表的节点数目范围是 [0, 50] [0,50]
  • − 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 100<=Node.val<=100
  • l 1 和 l 2 均 按 非 递 减 顺 序 排 列 l1 和 l2 均按 非递减顺序 排列 l1l2

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 18 21:03:53 2022
Function: 合并两个有序链表
@author: 小梁aixj
"""
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class LinkList:
    def __init__(self):
        self.head=None
    def initList(self, data):
        self.head = ListNode(data[0])
        r=self.head
        p = self.head
        for i in data[1:]:
            node = ListNode(i)
            p.next = node
            p = p.next
        return r
    def    convert_list(self,head):
        ret = []
        if head == None:
            return
        node = head
        while node != None:
            ret.append(node.val)
            node = node.next
        return ret
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        h = ListNode(0, None)
        p = h
        while l1 and l2:
            if l1.val < l2.val:
                p.next = l1
                p = l1
                l1 = l1.next
            else:
                p.next = l2
                p = l2
                l2 = l2.next
        if l1:
            p.next = l1
        else:
            p.next = l2
        return h.next
# %%
l = LinkList()
list1 = [1,2,4]
list2 = [1,3,4]
l1 = l.initList(list1)
l2 = l.initList(list2)
s = Solution()
print(l.convert_list(s.mergeTwoLists(l1, l2)))
#[1,1,2,3,4,4]

3,运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁辰兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值