题目
给定一个字符串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()