题目
有一种密钥协商方案,A电脑给B电脑发送一个一定长度的字符串S(假设长度为m),B电脑给A电脑发送一个整数n(规定:n<m),则将字符串S去掉n个字符后可以得到的字典序最小的字符串L作为两电脑协商之后的通信密钥。
输入:
bacaa
1
输出:
acaa
代码
这部分的代码可能写得像小学生写的,不要在意具体的语法,主要是看整体的思路
def find_min_letter(string):
"""
:param string:一个字符串
:return: 字符串中最小字母第一次出现的索引
"""
a_list = []
for i in string:
a_list.append(i)
min_letter = a_list[0]
for i in a_list:
if i < min_letter:
min_letter = i
else:
continue
for i in a_list:
if i == min_letter:
return a_list.index(i)
def find_max_letter(string):
"""
:param string: 一个字符串
:return: 字符串中最小字母第一次出现的索引
"""
a_list = []
for i in string:
a_list.append(i)
max_letter = a_list[0]
for i in a_list:
if i > max_letter:
max_letter = i
else:
continue
for i in a_list:
if i == max_letter:
return a_list.index(i)
def del_one(string):
"""
:param string: 一个字符串
:return: 删除字符串中对字典序影响最大的一个字符后的新字符串
"""
index_min = find_min_letter(string)
if index_min == 0: # 如果最小的字符为第一个字符,就调用函数自身对其余字符进行操作
return string[0] + del_one(string[1:])
else: # 寻找最小字符前面一部分的字符串里的最大字符,并把它删掉
front_string = string[:index_min]
index_max = find_max_letter(front_string)
new_string = string[:index_max] + string[index_max + 1:]
return new_string
a_string = input()
b_number = int(input())
for i in range(b_number):
a_string = del_one(a_string)
print(a_string)
思路
计算字符串中去掉一个字符后可以得到的字典序最小的字符串,将此字符串作为新的字符串继续计算,循环去除到指定数目。