文章目录
一、两数之和
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]]))