就像标题建议的那样,我想做一个RLE算法,而且我对此没有什么问题。
例如,在RLE算法中,如果采用aaaabbbccd,结果应该返回a4b3c2d1。
rle函数应该返回aaabbbccccddddd的压缩字符串。
rle(数据: str):str
所以应该是a3b3c4d5
这是代码,我知道这是错误的,但我不知道这是否是一个好的开始
def rle(data):
data = 'aaabbbccccddddd'
for i in range(0,len(data)):
if data.count(f'{i}') > 1:
data.replace(i, data.count(f'{i}'))
print(data)
print(rle(data))发布于 2022-04-29 01:21:35
这应该会更好
def rle(data):
# Initialize a few variables
prev = None
cnt = 0
res = ""
for i in data:
if i == prev:
# if same char as previous one, just add one to counter
cnt += 1
else:
# Check that we are not at first round and add to result
if prev != None:
res += "%s%s" % (cnt,prev)
# Set new character as previous one
prev = i
# Add last char to result
res += "%s%s" % (cnt,prev)
return res
print(rle("aaabbbccccddddd"))发布于 2022-04-29 01:21:53
data = 'aaabbbccccddddd'
seq = []
r = None
for d in data:
if d != r:
seq.append(d)
seq.append(str(1))
r = d
else:
seq[-1] = str(int(seq[-1]) + 1)
print("".join(seq))我以为这段代码很简单,所以没有解释.
我们有一个str,并希望将它转换为Char-TheNumberOfRepetitions对,比如['a',3,'b',3,'c',4,...],所以我们在str上循环一个char,当它是新的时,我们添加[char, 1]到列表,否则,我们在得到一个新的字符时,向list的最后一个元素添加1。
r变量用于新字符识别,是存储每个新字符的临时变量(如果char不等于它,则替换)
最后,我们使用['a',3,'b',3,'c',4,...]将str转换为join。
为什么我们使用str()和int()?因为python join方法有点傻:)并抛出一个异常,如果列表中的一个元素是int.每次我们把它转换成int添加1,然后再转换到str,再次.
为什么不是map?因为我认为OP是初学者,map对他来说很复杂.
还有,更多的节奏曲方式:
def rle(data: str) -> str:
seq = [data[0], 1]
for elem in data[1:]:
if elem != seq[-2]:
seq += [elem, 1]
else:
seq[-1] += 1
return ''.join(map(str, seq))与之相反:
def reverse_rle(data: str, end_char = '$') -> str:
def convert(): return seq[:-2] + [seq[-2] * (seq[-1] or 1)]
seq = [data[0], 0]
for elem in data[1:] + end_char:
if elem.isdigit():
seq[-1] = seq[-1] * 10 + int(elem)
else:
seq = convert()
if elem != end_char:
seq += [elem, 0]
return "".join(seq)如果你不想使用end_char
def reverse_rle(data: str) -> str:
def convert(): return seq[:-2] + [seq[-2] * (seq[-1] or 1)]
seq = [data[0], 0]
for elem in data[1:]:
if elem.isdigit():
seq[-1] = seq[-1] * 10 + int(elem)
else:
seq = convert() + [elem, 0]
return "".join(convert())https://stackoverflow.com/questions/72051723
复制相似问题