解题思路一(暴力法)
- 计算原数字所有位的总和
total_sum; - 遍历所有可能的删除区间
[l, r](1 ≤ l ≤ r ≤ n,n为数字长度); - 对每个区间,计算该区间内数字的和
sum(l, r); - 若
(total_sum - sum(l, r))是3的倍数,则计数加1; - 最后统计所有符合条件的区间数量。
代码实现(Python)
n = int(input())
s = input()
# 将字符转换为整数列表(每一位数字)
digits = [int(c) for c in s]
# 计算总数字和
total_sum = sum(digits)
count = 0
count = 1 if total_sum % 3 == 0 else 0
# 遍历所有可能的区间[l, r](注意:这里l和r是0-based索引,对应原1-based的l+1到r+1)
for i in range(n):
# 计算区间[l, r]的数字和
current_sum = 0
for j in range(i,n):
current_sum += digits[j]
# 判断删除该区间后是否为3的倍数
if (total_sum - current_sum)%3==0:
count+=1
print(count)
总结
- 暴力法通过三重循环实现:外层遍历区间起点,中层遍历区间终点,内层计算区间和;
- 时间复杂度为
O(n³),对于小规模数据(如n≤200)可以运行,但对于较大的n(如n=1000)会超时; - 核心逻辑简单直接,适合理解问题本质,但不适合处理大输入。
需要我为你讲解如何在暴力法基础上优化,降低时间复杂度吗?
解题思路二(前缀和)
n = int(input())
s = input().strip()
# 计算前缀和的模3数组
pre_sum = [0] * (n + 1)
for i in range(1, n + 1):
pre_sum[i] = (pre_sum[i-1] + int(s[i-1])) % 3
target = pre_sum[n] # 原串总和的模3结果
cnt = [0] * 3
cnt[pre_sum[0]] = 1 # 初始前缀和0出现1次
count = 0
# 遍历每个位置r,统计合法的区间[l, r]
for r in range(1, n + 1):
need = (pre_sum[r] - target) % 3
if need < 0: # 处理负数余数
need += 3
count += cnt[need]
cnt[pre_sum[r]] += 1 # 更新当前前缀和的出现次数
# 不删除任何区间的情况(原串本身是3的倍数)
no_operation = 1 if pre_sum[n] == 0 else 0
total = count + no_operation
print(total)



京公网安备 11010502036488号