【密钥协商】求解字符串去掉指定个数字符后的字典序最小的字符串(华为机试题)

这里写自定义目录标题

题目

有一种密钥协商方案,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)

思路

计算字符串中去掉一个字符后可以得到的字典序最小的字符串,将此字符串作为新的字符串继续计算,循环去除到指定数目。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值