一、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
完
感谢你看到这里!一起加油吧!