Python|每日一练|数组|递归|哈希表|get方法|单选记录:两数之和|多数元素|正则表达式匹配

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
  • 只会存在一个有效答案

选项代码:

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))

PS: python字典中的get方法

python字典的get方法会返回指定键的值,dict.get(‘’),返回对应的,如果键不在字典中则返回默认值None

2、多数元素(数组,哈希表)

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于  n/2  的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

 

示例 1

输入:[3,2,3]

输出:3

示例 2

输入:[2,2,1,1,1,2,2]

输出:2

 

进阶:

  • 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

选项代码(有调整,补充测试代码):

from typing import List
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        count, candi = 0, 0
        for i in nums:
            if i == candi:
                count += 1
            else:
                if count == 0:
                    candi = i
                    count = 1
                else:
                    count -= 1
        return candi

if __name__ == '__main__':
    nums =[2,2,1,1,1,2,2]
    s = Solution()
    print(s.majorityElement(nums))

3、正则表达式匹配(递归,字符串)

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.'  '*' 的正则表达式匹配。

  • '.' 匹配任意单个字符
  • '*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

示例 1

输入:s = "aa" p = "a"

输出:false

解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:s = "aa" p = "a*"

输出:true

解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。

示例 3

输入:s = "ab" p = ".*"

输出:true

解释:".*" 表示可匹配零个或多个('*')任意字符('.')。

示例 4

输入:s = "aab" p = "c*a*b"

输出:true

解释:因为 '*' 表示零个或多个,这里 'c'  0 , 'a' 被重复一次。因此可以匹配字符串 "aab"

示例 5

输入:s = "mississippi" p = "mis*is*p*."

输出:false

 

提示:

  • 0 <= s.length <= 20
  • 0 <= p.length <= 30
  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 .  *
  • 保证每次出现字符 * 时,前面都匹配到有效的字符

以下程序实现了这一功能,请你填补空白处内容:

class Solution:
	def isMatch(self, s: str, p: str) -> bool:
		if len(p) == 0:
			return len(s) == 0
		head_match = len(s) > 0 and (s[0] == p[0] or p[0] == '.')
		if len(p) > 1 and p[1] == '*':
			__________________________;
		else:
			if not head_match:
				return False
			return self.isMatch(s[1:], p[1:])
# %%
s = Solution()
print(s.isMatch(s = "aa" , p = "a"))

选项代码:

if head_match and self.isMatch(s[1:], p):

       return True

return self.isMatch(s, p[2:])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
递归下降分析器是一种常见的语法分析方法,适用于递归文法。在给定的算术表达式文法中,e代表表达式,t代表项,|代表或。根据该文法,我们可以编写一个简单的递归下降分析器来解析算术表达式。 首先,我们需要定义一个函数来解析表达式e。在e的定义中,e可以是e加上t,e减去t,或者只有t。因此,我们可以定义一个递归函数来解析表达式e: ```python def parse_e(): t = parse_t() if current_token == '+': consume_token('+') e = parse_e() return t + e elif current_token == '-': consume_token('-') e = parse_e() return t - e else: return t ``` 接下来,我们需要定义一个函数来解析项t。在t的定义中,t可以是e乘以t,e除以t,或者只有一个因子。因此,我们可以定义另一个递归函数来解析项t: ```python def parse_t(): factor = parse_factor() if current_token == '*': consume_token('*') t = parse_t() return factor * t elif current_token == '/': consume_token('/') t = parse_t() return factor / t else: return factor ``` 最后,我们还需要定义一个函数来解析因子。在因子的定义中,因子可以是一个数字或者一个用括号包裹的表达式。因此,我们可以定义一个简单的函数来解析因子: ```python def parse_factor(): if current_token.isdigit(): return int(current_token) elif current_token == '(': consume_token('(') e = parse_e() consume_token(')') return e else: raise SyntaxError('Invalid expression') ``` 以上就是一个简单的递归下降分析器的实现,它可以解析给定算术表达式的语法结构。通过递归地调用不同的解析函数,我们可以很容易地构建一个递归下降分析器来处理各种复杂的文法规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

打酱油的工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值