自己想出的版本,用到了字典的删除del mp[s[i]]
,适用于本题手动模拟,然后将手动模拟的思路用代码来实现
k = int(input())
s = input()
mp = {}
cnt = 0
i = 0
length = len(s)
while i < length:
t = s[i] * k
substr = s[i:i + k]
if t == substr:
if s[i] not in mp:
cnt += 1
mp[s[i]] = cnt # cnt是便于之后的排序,因为最后输出时题目的要求:按照检测顺序在一行中输出所有可能卡住的按键
i = i + k
else:
if s[i] in mp:
del mp[s[i]]
i = i + 1
# 为什么要遍历第二遍字符串呢?
# 以这个字符串为例:kfs55559vt2iiiioooooo55555iiiiiiiiiiiiiiii99999999
# 对于这个字符串键盘'9'不是损坏的键,但是上面的第一遍遍历会将'9'加入字典
i = 0
while i < length:
t = s[i] * k
substr = s[i:i + k]
if t != substr:
if s[i] in mp:
del mp[s[i]]
i = i + 1
else:
i = i + k
li = list(mp.items())
li.sort(key = lambda x : x[1])# 按照cnt从小到大排序
ans = ''
# 将原字符串中重复出现k次的卡住的键盘字符替换为1个字符
for key,v in li:
ans += key
s = s.replace(key * k,key)
print(ans)
print(s)
大佬写的版本,使用了python中的Counter类和正则表达式
import re # 导入正则表达式模块
from collections import Counter # 从collections模块导入Counter类,用于计数
k = int(input())
s = input()
cnt = Counter(s) # 使用Counter计算字符串s中每个字符的出现次数
t = []
for i in cnt:
cur = re.findall(i * k, s) # 使用正则表达式查找字符串s中所有连续出现的字符i,且长度等于k的子串
# 如果找到了这样的子串
if cur:
# 将这些子串添加到列表t中
t.extend(cur)
# 使用Counter计算列表t中所有字符的出现次数(即将所有找到的子串合并后再计数)
tt = Counter(''.join(t))
# 初始化一个空列表,用于存储满足条件的字符
temp_list = []
# 遍历计数器tt中的每个字符i及其出现次数
for i in tt:
# 检查字符i在tt和cnt中的出现次数是否相等
if tt[i] == cnt[i]:
# 如果相等,将字符i添加到temp_list中
temp_list.append(i)
# 使用join方法将temp_list中的字符连接成一个字符串,并赋值给ans
ans = ''.join(temp_list)
print(ans)
# 遍历答案字符串ans中的每个字符
for i in ans:
# 如果ans中的字符i重复k次组成的子串在列表t中存在
if i * k in t:
# 将原始字符串s中所有这样的子串替换为单个字符i
s = s.replace(i * k, i)
print(s)
extend和append的区别
在Python中,extend
方法和append
方法都是用于向列表添加元素的方法,但它们在使用方式和应用场景上存在显著的区别。
append方法:
- 功能:
append
方法用于将一个元素添加到列表的末尾。 - 参数:它接受一个参数,即要添加到列表末尾的元素。这个元素可以是任何数据类型,包括整数、字符串、列表等。
- 返回值:
append
方法没有返回值,但它会修改原列表,即在原列表的末尾添加一个新的元素。 - 示例:
fruits = ['apple', 'banana', 'cherry']
fruits.append('orange')
print(fruits) # 输出: ['apple', 'banana', 'cherry', 'orange']
extend方法:
- 功能:
extend
方法用于将一个可迭代对象(如列表、元组、字符串等)中的所有元素添加到列表的末尾。 - 参数:它接受一个参数,即要添加到列表末尾的可迭代对象。这个可迭代对象中的每个元素都会被添加到原列表中。
- 返回值:
extend
方法同样没有返回值,但它也会修改原列表,即在原列表的末尾添加多个元素。 - 示例:
fruits = ['apple', 'banana', 'cherry']
fruits_to_add = ['orange', 'grape', 'watermelon']
fruits.extend(fruits_to_add)
print(fruits) # 输出: ['apple', 'banana', 'cherry', 'orange', 'grape', 'watermelon']
主要区别:
- 添加元素的方式:
append
方法只能添加一个元素,而extend
方法可以一次性添加多个元素。 - 参数类型:
append
方法的参数可以是任何数据类型,但extend
方法的参数必须是一个可迭代对象。 - 性能:在需要添加多个元素时,使用
extend
方法通常比多次调用append
方法更高效,因为它可以减少函数调用的次数。
python的Counter类
Python的Counter
类是一个字典子类,在collections
模块中定义。它用于计数可哈希对象。Counter
对象是一个集合,其中元素存储为字典的键,而它们的计数存储为字典的值。Counter
类的主要用途是作为一个计数器,用于跟踪某些元素出现的次数。
创建一个Counter对象:
你可以通过传递一个可迭代对象(如列表、元组、字符串等)或一个字典来创建一个Counter
对象。如果传递的是可迭代对象,Counter
会计算每个元素出现的次数;如果传递的是字典,则字典的键会被用作元素,字典的值会被用作计数。
from collections import Counter
# 使用列表创建Counter
c1 = Counter(['a', 'b', 'c', 'a', 'b', 'b'])
print(c1) # 输出: Counter({'b': 3, 'a': 2, 'c': 1})
# 使用字典创建Counter
c2 = Counter({'a': 2, 'b': 3, 'c': 1})
print(c2) # 输出: Counter({'b': 3, 'a': 2, 'c': 1})
Counter的方法:
Counter
类提供了许多有用的方法,包括:
elements()
: 返回一个迭代器,其中每个元素重复其计数次数。most_common([n])
: 返回一个列表,其中包含n
个最常见的元素和它们的计数(默认n
为所有元素)。update([iterable-or-mapping])
: 更新计数器,类似于字典的update()
方法。subtract([iterable-or-mapping])
: 从计数器中减去元素,类似于update()
但使用减法。copy()
: 返回计数器的浅拷贝。
示例用法:
from collections import Counter
# 创建一个Counter对象
c = Counter(['a', 'b', 'c', 'a', 'b', 'b', 'd'])
print(c) # Counter({'b': 3, 'a': 2, 'c': 1, 'd': 1})
print(len(c)) # 4
# 获取元素的总数
total = sum(c.values())
print('Total elements:', total) # 输出: Total elements: 7
# 获取最常见的元素及其计数
most_common = c.most_common(2)
print('Most common elements:', most_common) # 输出: Most common elements: [('b', 3), ('a', 2)]
# 更新计数器
c.update(['e', 'f', 'a'])
print('Updated counter:', c) # 输出: Updated counter: Counter({'a': 3, 'b': 3, 'c': 1, 'd': 1, 'e': 1, 'f': 1})
# 从计数器中减去元素
c.subtract(['a', 'b', 'b'])
print('Subtracted counter:', c) # 输出: Subtracted counter: Counter({'a': 2, 'c': 1, 'd': 1, 'e': 1, 'f': 1})