笔试题汇总

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=' ')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值