1.两数之和+20.有效的括号

题目1 两数之和

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解法 1–双重循环遍历

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            if((target-nums[i] in nums) and (nums.index(target-nums[i]) != i)):
                return [i, nums.index(target-nums[i])]```

解法 2–字典保存value

这个解法有个地方很有意思,就是当你的列表为[6,6],12 时,你的 dict 实际上是会被重置一次key 为 6 时的 value 的,但是因为本题目明确说了只会有一个答案,所以这种情况也是被包含了.而[6,6,6],12 是不会出现在题目中的.

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap = {}
        for index, value in enumerate(nums):
            hashmap[value] = index
        for i in range(len(nums)):
            j = hashmap.get(target-nums[i])
            if j is not None and j != i:
                return [i, j]

题目20 有效的括号

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

有效字符串需满足:

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

示例 1:

输入: "()"
输出: true
示例 2:

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

输入: "(]"
输出: false
示例 4:

输入: "([)]"
输出: false
示例 5:

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

解法–栈

栈是显而易见的解法,这里优化的地方是奇数长度的 s 必不满足,不需要考虑.

class Solution:
    def isValid(self, s: str) -> bool:
        if(len(s) % 2 == 1):
            return False
        stack = []
        for i in s:
            if len(stack) == 0:
                stack.append(i)
                continue
            if match(stack[-1], i):
                stack.pop()
            else:
                stack.append(i)
        if len(stack) == 0:
            return True
        else:
            return False


def match(s1: str, s2: str) -> bool:
    if (s1 == '(' and s2 == ')') or (s1 == '{' and s2 == '}')or (s1 == '[' and s2 == ']'):
        return True
    else:
        return False

新学到知识

1. 类型注解

def add(x:int, y:int) -> int:
    return x + y

用 : 类型 的形式指定函数的参数类型,用 -> 类型 的形式指定函数的返回值类型。

然后特别要强调的是,Python 解释器并不会因为这些注解而提供额外的校验,没有任何的类型检查工作。也就是说,这些类型注解加不加,对你的代码来说没有任何影响:

2. 迭代器

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象.
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

x = [1,2,3,4]
it = iter(x)# 初始化的it是空值的,不能直接访问
value = next(it) # it的类型是list_iterator object,next()和value的类型是int

3. 获取for循环中的index

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

lists = [1,2,3,4]
for index,value in enumerate(lists):
    print("%s--%s" %(index,value))

4. 判断值是否在list中

nums=[1,2,3]
num = 5
if(num in nums):
    print(1111)

5. 返回list中给定值的下标

逻辑:从列表中找出某个值第一个匹配项的索引位置

list.index(obj)

6. python dict的底层实现是用hash表

7. python没有专门的stack结构,用list实现

入栈操作–>append()
出栈操作–>pop()

stack = [3,4,5]
stack.append(6)
stack.append(7)#[3,4,5,6,7]
stack.pop()#[3,4,5,6]
stack.pop()#[3,4,5]

更多不知道你感不感兴趣的信息,可以关注一下我的公众号
有空来看看哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值