每日一练 — 2021.11.23

本文介绍了三个经典的计算机科学问题:两数之和,通配符匹配以及合并区间。针对每个问题,分别给出了详细的问题描述、示例输入输出以及对应的Python源代码。在两数之和问题中,通过哈希表实现高效查找。通配符匹配利用动态规划解决,而合并区间则通过排序和迭代完成。这些算法展示了在解决特定问题时的有效策略和数据结构使用。
摘要由CSDN通过智能技术生成


一、两数之和

1.程序简介,要求

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。


示例 1

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3

输入:nums = [3,3], target = 6
输出:[0,1]

提示

2 <= nums.length <= 103
-109 <= nums[i] <= 109
-109 <= target <= 109
注:只会存在一个有效答案


2.源代码

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 23 12:08:12 2021
Function:
@author: 小梁aixj
"""

def  twosum(nums, target):
    cache = {}
    i=0
    while i < len(nums):
        right=target-nums[i]
        if cache.get(right) is not None:
            return [cache[right],i]
        else:
            cache[nums[i]]=i
        i += 1
    return []
#%%
print(twosum([2,7,11,15],9))
print(twosum([3,2,4],6))
print(twosum([3,3], 6))

3.运行结果

在这里插入图片描述


二、通配符匹配

1.程序简介,要求

给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。

‘?’ 可以匹配任何单个字符。’*’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。


说明

s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。

示例 1

输入:s = "aa"p = “a”
输出: false
解释: “a” 无法匹配 “aa” 整个字符串。

示例 2

输入:s = "aa"p = ""
输出: true
解释: '
’ 可以匹配任意字符串。

示例 3

输入:s = "cb"p = “?a”
输出: false
解释: ‘?’ 可以匹配 ‘c’, 但第二个 ‘a’ 无法匹配 ‘b’。

示例 4

输入:s = "adceb"p = “ab”
输出: true
解释: 第一个 ‘’ 可以匹配空字符串, 第二个 '’ 可以匹配字符串 “dce”.

示例 5

输入:s = "acdcb"p = “a*c?b”
输出: false


2.源代码

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 23 12:10:20 2021
Function:
@author: 小梁aixj
"""

class Solution(object):
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        s_index, p_index = 0, 0
        star, s_star = -1, 0
        s_len,p_len=len(s),len(p)
        while s_index < s_len:
            if p_index < p_len and (s[s_index]==p[p_index] or p[p_index]=='?'):
                s_index += 1
                p_index += 1
            elif p_index < p_len and p[p_index] == '*':
                star = p_index
                s_star = s_index
                p_index += 1
            elif star != -1:
                p_index = star + 1
                s_star += 1
                s_index=s_star
            else:
                return False
        while p_index < p_len and p[p_index] == '*':
            p_index += 1
        return p_index == p_len
if __name__ == '__main__':
    s=Solution()
    print(s.isMatch(s = "aa", p = "a"))
    print(s.isMatch(s="aa",p="*" ))
    print(s.isMatch(s="cb", p="?a"))
    print(s.isMatch(s="adceb", p="*a*b"))
    print(s.isMatch(s="acdcb", p="a*c?b"))

3.运行结果

在这里插入图片描述


三,合并区间

1.程序简介,要求

  • 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 1:
  • 输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
  • 输出:[[1,6],[8,10],[15,18]]
  • 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
  • 输入:intervals = [[1,4],[4,5]]
  • 输出:[[1,5]]
  • 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

2.源代码

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 23 12:10:07 2021
Function: 合并区间
@author: 小梁aixj
"""
class Interval(object):
    def __init__(self, s=0, e=0):
        self.start = s
        self.end = e
class Solution(object):
    def list2interval(self, list_interval):
        ret = []
        for i in list_interval:
            interval = Interval(i[0], i[1])
            ret.append(interval)
        return ret
    def interval2list(self, interval):
        ret = []
        x = [0,0]
        for i in interval:
            x[0] = i.start
            x[1] = i.end
            ret.append(x)
            x = [0,0]
        return ret
    def merge(self, intervals):
        """
        :type intervals: List[Interval]
        :rtype: List[Interval]
        """
        if intervals is None:
            return
        ls = len(intervals)
        if ls <= 1:
            return intervals
        intervals = self.list2interval(intervals)        
        intervals.sort(key=lambda x: x.start)
        pos = 0
        while pos < len(intervals) - 1:
            if intervals[pos].end >= intervals[pos + 1].start:
                next = intervals.pop(pos + 1)
                if next.end > intervals[pos].end:
                    intervals[pos].end = next.end
            else:
                pos += 1
        intervals = self.interval2list(intervals)
        return intervals
if __name__ == '__main__':
    s = Solution()
    print (s.merge(intervals = [[1,4],[4,5]]))
    print (s.merge(intervals = [[1,3],[2,6],[8,10],[15,18]]))

3.运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梁辰兴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值