解题思路一(暴力法)

  1. 计算原数字所有位的总和total_sum
  2. 遍历所有可能的删除区间[l, r]1 ≤ l ≤ r ≤ nn为数字长度);
  3. 对每个区间,计算该区间内数字的和sum(l, r)
  4. (total_sum - sum(l, r))是3的倍数,则计数加1;
  5. 最后统计所有符合条件的区间数量。

代码实现(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)

总结

  1. 暴力法通过三重循环实现:外层遍历区间起点,中层遍历区间终点,内层计算区间和;
  2. 时间复杂度为O(n³),对于小规模数据(如n≤200)可以运行,但对于较大的n(如n=1000)会超时;
  3. 核心逻辑简单直接,适合理解问题本质,但不适合处理大输入。

需要我为你讲解如何在暴力法基础上优化,降低时间复杂度吗?

解题思路二(前缀和)

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)