固定k值的模块 总结成三步:入-更新-出。
入:下标为 i 的元素进入窗口,更新相关统计量。如果 i<k−1 则重复第一步。 更新:更新答案。一般是更新最大值/最小值。 出:下标为 i−k+1 的元素离开窗口,更新相关统计量。 以下题为例:
给你字符串 s 和整数 k 。
请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。
英文中的 元音字母 为(a, e, i, o, u)。
func maxVowels(s string, k int) (ans int) {
vowel := 0
for i, in := range s {
// 1. 进入窗口
if in == 'a' || in == 'e' || in == 'i' || in == 'o' || in == 'u' {
vowel++
}
if i < k-1 { // 窗口大小不足 k
continue
}
// 2. 更新答案
ans = max(ans, vowel)
// 3. 离开窗口
out := s[i-k+1]
if out == 'a' || out == 'e' || out == 'i' || out == 'o' || out == 'u' {
vowel--
}
}
return
}
class Solution:
def maxVowels(self, s: str, k: int) -> int:
vowel = 0
ans=0
for i, c in enumerate(s):
if c in "aeiou":
vowel += 1
if i < k - 1:
continue
ans=max(vowel,ans)
# 出
if s[i - k + 1] in "aeiou":
vowel -= 1
print(ans)
return ans
如果是固定长度切割字符
python
[s[i:i+length] for i in range(0, len(s), length)]
golang
func splitFixedLength(s string, length int) []string {
var result []string
for i := 0; i < len(s); i += length {
end := i + length
if end > len(s) {
end = len(s)
}
result = append(result, s[i:end])
}
return result
}
拆炸弹 leetcode.cn/problems/de… eg: [1,2,3,4,5]给你一个i,和一个k,计算加i以后的k个数,例如, i=0;k=2,那么就是2+3=5 i=1 就是3+4=7 i=2 就是4+5
func decrypt(code []int, k int) []int {
n := len(code)
result := make([]int, n)
if k == 0 {
return result
}
for i := 0; i < n; i++ {
total := 0
if k > 0 {
// Sum the next k elements
for j := 1; j <= k; j++ {
total += code[(i+j)%n]
}
} else {
// Sum the previous |k| elements
for j := 1; j <= -k; j++ {
total += code[(i-j+n)%n]
}
}
result[i] = total
}
return result
}
做到O(n)
class Solution:
def decrypt(self, code: List[int], k: int) -> List[int]:
n = len(code)
ans = [0] * n
r = k + 1 if k > 0 else n
k = abs(k)
s = sum(code[r - k: r]) # ans[0]
for i in range(n):
ans[i] = s
s += code[r % n] - code[(r - k) % n]
r += 1
return ans