笔试题汇总

该博客介绍了一个Python程序,用于处理只包含01的字符串。程序遍历字符串,计算每个位置前缀子串中0和1的数量,通过gcd求得比例并存储。最后返回每个位置满足01数量相等的子串个数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01分隔

第一行输入 n 字符串长度, 第二行为字符串,字符串只包含01,返回数组,表示每个位置前缀字符串能被划分为 01相同比例的子串的个数,例如 分成 两个子串01个数分别为 (a,b) & (c,d) 则满足 ad = bc。

思路: 遍历一次字符串,记录01出现次数,字典保存比例出现次数,比例化为最简,有一个出现0次的情况统一归为(0,1) | (1,0),将当前位置比例对应次数返回

import collections
import math

n = int(input())
s = input()
res = [1]*n
ones = zeros = 0
d = collections.defaultdict(int)
for i in range(n):
    if s[i] == '0':
        zeros += 1
    else:
        ones += 1
    if zeros == 0:
        d[(0, 1)] += 1
        res[i] = d[(0,1)]
    elif ones == 0:
        d[(1,0)] += 1
        res[i] = d[(1,0)]
    else:
        g = math.gcd(zeros, ones)
        d[(zeros//g, ones//g)] += 1
        res[i] = d[(zeros//g, ones//g)]
for r in res:
    print(r, end=' ')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值