字符串的统计字符串

题目

给定一个字符串s,返回s 的统计字符串。例如’aaabbadddffc’的统计字符串为’a_3_b_2_a_1_d_3_f_2_c_1’。

思路

从一个位置beg开始找相同符号,到第一个不同的字符或超出字符串长度end,end-beg为相同字符个数。

实现

def count_string(s):
    if s is None or len(s) == 0:
        return s

    beg, end = 0, 0
    ret = ''
    while beg < len(s):
        end = beg
        while end < len(s) and s[end] == s[beg]:
            end += 1
        ret += s[beg] + '_' + str(end-beg)
        if end != len(s):
            ret += '_'
        beg = end

    return ret

补充题目

给定一个字符串的统计字符串cs,再给一个整数index,返回cs 所代表原始字符串的第index个字符。例如’a_1_b_100‘,index=0,返回’a’,index=50,返回’b’。

思路

解析每个字符对应的个数,统计总共经过了多少字符,跟index比较。

实现

def get_char(cs, index):
    beg = 0
    index += 1
    while index >= 0:
        c = cs[beg]
        beg += 2
        i = beg
        while i < len(cs) and cs[i].isdigit():
            i += 1

        num = int(cs[beg:i])
        if index <= num:
            return c

        beg = i+1
        index -= num

    return None

测试

def test_count_string():
    assert(count_string('aaabbadddffc') == 'a_3_b_2_a_1_d_3_f_2_c_1')
    assert(count_string('aaabbbbbbbbcde') == 'a_3_b_8_c_1_d_1_e_1')

    s = 'aaabbadddffc'
    cs = count_string(s)
    for i in range(len(s)):
        print(i, s[i], get_char(cs, i))
        assert(s[i] == get_char(cs, i))

    s = 'a'*1 + 'b'*11 + 'c'*111
    cs = count_string(s)
    for i in range(len(s)):
        print(i, s[i], get_char(cs, i))
        assert(s[i] == get_char(cs, i))
    print('done')


if __name__ == '__main__':
    test_count_string()

牛客网-字符串的统计字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值