2024.3.18力扣刷题记录

一、2011. 执行操作后的变量值(<=1200)

1.多行代码,设置参数x。代码如下:

class Solution:
    def finalValueAfterOperations(self, operations: List[str]) -> int:
        # 多行
        x = 0
        for oper in operations:
            if oper == 'X++' or oper == '++X':
                x += 1
            else:
                x -= 1
        return x

2.一行代码,无参数。因为x初值为0,可以直接不设置参数,加为1,减为-1,求和即可;如果x初值不为0,可以求和后加上x即可。代码如下:

class Solution:
    def finalValueAfterOperations(self, operations: List[str]) -> int:
        # 一行
        return sum(1 if  oper == 'X++' or oper == '++X' else -1 for oper in operations)

3.直接判断输入操作的第二个字符,参考自官方题解(. - 力扣(LeetCode))。代码如下:

class Solution:
    def finalValueAfterOperations(self, operations: List[str]) -> int:
        # 一行
        return sum(1 if  oper[1] == '+' else -1 for oper in operations)

 二、1446. 连续字符(<=1200)

1.滑动窗口,同向双指针。

class Solution:
    def maxPower(self, s: str) -> int:
        #滑动窗口
        l,ans = 0,0
        for r,c in enumerate(s):
            while c != s[l]:
                l += 1
            ans = max(ans,r-l+1)
        return ans

2.遍历

class Solution:
    def maxPower(self, s: str) -> int:
        # 遍历
        ans,cnt = 1,1
        #遍历从1开始,不包括第一个字符,但第一个肯定满足条件,ans最小为1
        for i in range(1,len(s)):
            if s[i] != s[i-1]:
                cnt = 1
            else:
                cnt += 1
                ans = max(ans,cnt)  #更新
        return ans

这两个方法时间复杂度都是O(n),空复均为O(1)。

三、997. 找到小镇的法官(1200-1400)

有向图,方法参考官方题解(. - 力扣(LeetCode))。根据思路自写代码如下:

class Solution:
    def findJudge(self, n: int, trust: List[List[int]]) -> int:
        #结合示例,第三个属性表示其他人不能同时满足属性1、2
        #而普通人不能满足1,说明都满足2,且只有一个法官
        #法官满足1,2
        #有向图
        #计算节点入度和出度
        #法官入度为n-1,出度0
        in_,out_ = [0]*n,[0]*n
        for o,i in trust:
            out_[o-1] += 1
            in_[i-1] += 1
        for i in range(n):
            if in_[i] == n-1 and out_[i] == 0:
                return i+1
        return -1

官方题解代码如下:

class Solution:
    def findJudge(self, n: int, trust: List[List[int]]) -> int:
        inDegrees = Counter(y for _, y in trust)
        outDegrees = Counter(x for x, _ in trust)
        return next((i for i in range(1, n + 1) if inDegrees[i] == n - 1 and outDegrees[i] == 0), -1)

chatgpt对next()函数解释如下:

`next()` 函数是 Python 的内置函数之一,它用于从迭代器(iterator)中获取下一个元素。

迭代器是一种实现了迭代协议的对象,它可以逐个返回元素,直到没有更多元素可供迭代。`next()` 函数的作用就是从迭代器中获取下一个元素。

以下是 `next()` 函数的基本语法:
```python
next(iterator, default)
```

- `iterator` 是一个迭代器对象。
- `default` (可选)是一个默认值,在迭代器耗尽时返回该默认值。如果不提供默认值,而迭代器耗尽时仍然调用 `next()` 函数,则会引发 `StopIteration` 异常。

以下是一个示例,演示如何使用 `next()` 函数从迭代器中获取下一个元素:
```python
my_list = [1, 2, 3, 4, 5]
my_iter = iter(my_list)

print(next(my_iter))  # 输出结果为 1
print(next(my_iter))  # 输出结果为 2
print(next(my_iter))  # 输出结果为 3
```

在这个例子中,我们首先将列表 `my_list` 转换为迭代器 `my_iter`,然后使用 `next()` 函数分别从迭代器中获取下一个元素。每次调用 `next()` 函数时,它会返回迭代器中的下一个元素,直到迭代器耗尽。

四、 2124. 检查是否所有 A 都在 B 之前(1200-1400)

1.遍历,在b出现之后没有再出现过a。

class Solution:
    def checkString(self, s: str) -> bool:
        # 遍历 时复O(n),空复O(1)
        i = 0
        while i<len(s) and s[i] != 'b':
            i += 1
        for j in range(i,len(s)):
            if s[j] == 'a':
                return False
        return True

 2.一行,根据性质,不出现ba即满足。

class Solution:
    def checkString(self, s: str) -> bool:
        # 一行
        return 'ba' not in s

3.比较出现下标,方法来自官方题解(. - 力扣(LeetCode))。a最后一次出现的下标aidx小于b第一次出现的下标bidx即可。注意:可能存在没有a或没有b的情况,所以初始化aidx为-1(a未出现,b第一次出现下标为0),bidx为n(b未出现,a最后一次出现下标为n-1)。根据方法自写代码如下:

class Solution:
    def checkString(self, s: str) -> bool:
        # 比较下标
        n = len(s)
        aidx,bidx = -1,n
        for i in range(n):
            if s[i] == 'a':
                aidx = i    #一直更新
            else:
                bidx = min(bidx,i)  #取最小值,即第一次
        return aidx < bidx

感谢你看到这里!一起加油吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值