巧妙收集答案为力求一个循环出结果
题目链接
3倍子串
代码如下
# 思想:前缀和两个数对3的余数相同则这两个数之间的和就是可以被3整除
# 0,1,2,3 前缀和-> 0,1,3,6 %3-> 0,1,0,0
s = input()
s = [0]+list(map(int,s))
cnt = [1,0,0]
ans = 0
for i in range(1,len(s)):
s[i] = (s[i]+s[i-1])%3
ans += cnt[s[i]]
cnt[s[i]] += 1
print(ans)
k被区间
# 思路,前缀和%K,有相同的值,说明他们之间是可以整除k的
# 比如:2 10 5 前缀和:2,12,17 %5:2,2,2 相同都是2说明有1+2=3个区间
n,k = map(int,input().split())
cnt = [0]*k
cnt[0]=1
ans = 0
s = 0
for _ in range(n):
s += int(input())
t = s%k
ans += cnt[t]
cnt[t] += 1
print(ans)
循环播放
from bisect import bisect_left
n = int(input())
a = [0]+list(map(int,input().split()))
for i in range(1,n+1):
a[i] += a[i-1]
t = int(input())
rest = t%a[-1] # 求播完多整遍之后还剩下还有多少轮
if rest == 0: # 正好播完
print(n)
else:
print(bisect_left(a,rest)) # 采用二分查找
子串简写
k = int(input())
s,c1,c2 = input().split()
cnt = 0 # 看前面有多少个符合条件的c1
ans = 0 # 计算结果
for i,c in enumerate(s,1):
if i >= k and s[i-k] == c1:
cnt += 1
if c == c2:
ans += cnt
print(ans)
最近距离
n = int(input())
a = list(map(int,input().split()))
b = [i for i,v in enumerate(a) if v == 0]
m = len(b) # a中有多少个0
res = [0] * n
cnt = 0 # 计算遍历当前的第几个0
for i,v in enumerate(a):
if v == 0:
cnt += 1
elif cnt == 0:
res[i] = b[0]-i
elif cnt == m:
res[i] = i - b[-1]
else:
res[i] = min(b[cnt]-i,i-b[cnt-1])
print(*res)
文章评论