我的任务是删除字符串中的重复字母
remove_repeat(msg):
示例
remove_repeat("bookkeeper")
→'bokeper'
remove_repeat("aaabcaaddddeff")
→'abcadef'
remove_repeat("a")
→'a'
到目前为止我掌握的密码是
def remove_repeat(msg):
removed=[]
for i in msg:
if i not in removed:
removed.append(i)
return removed
我不知道如何继续这个代码。我不允许使用“join”或“set”。给出了一个使用+=的提示,但我不知道如何在这里合并它
首先,第二个示例
remove_repeat("aaabcaaddddeff") → 'abcadef'
不会与代码一起出现。第二组a仍然会失败,因为“a”已经在remove
中。您需要对照remove中的前一个字母测试每个字母。你知道吗其次,+=with strings与append相同。以下几行是等效的。你知道吗
首先将remove初始化为msg中的第一个条目(因为它不能是重复的)。现在循环msg的其余部分,根据remove中的前一个字符测试每个新字符。如果不匹配
如果您使用
list
来累积结果,那么将其转换回str
的唯一好方法就是使用''.join
。但由于这是一个类赋值,所以可能不好,只需重复str
串联即可完全避免list
:这符合您的逻辑和规则,但它仍然会导致逻辑错误,因为目标是删除连续重复,而不是同一重复的所有重复。要修复此问题,只需跟踪最后一个字母:
let != newmsg[-1:]
也可以作为not newmsg.endswith(let)
完成,不确定是否允许使用str
方法,所以我坚持使用切片测试。你知道吗作为记录,如果我在一个类之外实现这个,并且输入可能很大(我非常需要优化它,谁知道为什么),我会:
但这可能有点太聪明了。
groupby
将连续的重复字母分组,map(itemgetter(0),
保持组键(重复组的单个字母),并且''.join
将所有字母重新缝合在一起。你知道吗请注意,前面的两个解决方案都会删除每个字母后面的所有副本,而不仅仅是紧跟其后的副本。你知道吗
相反
相关问题 更多 >
编程相关推荐