CSDN编程竞赛第五十三期题解(Python)

文章介绍了两道编程题的解题思路。第一题涉及统计字符出现频率,使用Python字典存储并找出出现次数最多的字母。第二题讨论如何确定在已排序整数数组中插入最少数量的数以形成等差数列,通过计算不同公差的可能性来找出最小插入数。
摘要由CSDN通过智能技术生成

1、题目一. 贝博士外星信号统计

贝博士最近收到了一些来自外星的信号,它们看起来是一些字符。经过贝博士的转码,把这些字符用26个小写拉丁字母表 示。 贝博士叫来了助手艾小姐,请她把这些字母中出现次数最多者挑出来,并按字母表顺序排列出来(忽略空格)。

示例

输入:hello world o

输出:lo

解释:字母" l " 与 字母 " o " 的出现次数都为3次,且字母" l " 在字母表中的顺序排在字母 " o "的前面,因此输出的结果为 " lo "

解题思路:

要求是统计每个字母出现的次数,并挑选出出现最多的一个或多个。要实现这个统计的要求,python中的字典是一个不错的选择。所以我是将出现的字母作为字典的键,该字母出现的次数作为字典的值,再用一个变量记录一下出现次数最多是多少,方便我们最终找到该字母。

str_data_list = input().split(" ")
# 去掉输入字符串的空格----方便后面的遍历操作
str_data = "".join(str_data_list)
# 定义一个空字典
word_dic = {}
# 定义一个变量表示出现次数最多为多少
biggest_number = 0
# 定义一个空列表------因为如果字母有多个的话是要排序的
result_list = []
result = None
# 遍历输入的字符串,统计每个字母出现的次数,并将其存入到字典
for item in str_data:
    # 如果该字母在字典中就更新次数
    if item in word_dic:
        word_dic[item] += 1
    # 如果不存在就添加进列表,并将值赋值为1
    else:
        word_dic[item] = 1
    # 更新出现次数的最大值
    biggest_number = max(biggest_number, word_dic[item])
# 根据最大值,去字典中找哪些字母满足条件,将满足条件的字母添加到列表中
for item in word_dic:
    if word_dic[item] == biggest_number:
        result_list.append(item)
# 对最终的结果列表进行排序,输出
result_list.sort()
result = "".join(result_list)
print(result)

2、题目二、等差数列

给定一已排序的正整数组成的数组,求需要在中间至少插入多少个数才能将其补全成为一等差数列。 “在中间插入”的意思 是:不能在第一个数之前,或最后一个数之后插入数。

提示:若不能成为等差数列,则输出NaN。若不用插入任何数,即输入值本身就是等差数列,则输出0

示例:

输入:1 3 7

输出:1

解释:当在数字3与数字7之间插入数字5后,就构成了公差为2的等差数列,因此最少插入数为1

输入:1 7 7

输出:NaN

输入:1 3 5

输出:0

解题思路

首先要考虑输入了多少个值,如果只输入一个值或一个值都没有输入,那么该输入值是一定不能构成等差数列的,所以输出为NaN。如果输入了两个值,那么输入值不论如何都能构成等差数列,即公差为第二个值减去第一个值的差,所以输出为0。当输入了三个及三个以上的值时,结果就不唯一了。首先考虑特殊情况,即出现NaN的情况和输入值全部相同的情况,当输入值中出现相同值但又不全部相同时,就会出现NaN的结果。当输入值全部相同时,公差为0,那么输出结果就为0。然后是考虑普遍情况,因为是中间插入,那么输入值的首尾的位置是不会改变的。那么这个数列的公差最大的可能取值就是第二个数减去第一个数与最后一个数减去倒数第二个数的最小值。这个数列的公差最小的可能取值为1(因为除去特殊情况,在公差为1的情况下是一定能组成等差数列的),那么我们只需要将公差值从最大到1进行尝试,即可得出最少插入数。

input_data = input().split(" ")
# 输入值为0个或1个的情况
if len(input_data) == 0 or len(input_data) == 1:
    result = "NaN"
# 输入值为2个的情况
elif len(input_data) == 2:
    result = 0
# 输入值大于等于3个的情况
else:
    # big_distant表示最大的公差
    big_distant = int(input_data[-1]) - int(input_data[-2])
    big_distant = min(big_distant, int(input_data[1]) - int(input_data[0]))
    result = "NaN"
    # 当最大公差为0时,检验是否所有输入值都相等
    if big_distant == 0:
        # 如果都相同时result的值
        result = 0
        for item in input_data:
            # 不相等则输出NaN
            if item != input_data[0]:
                result = "NaN"
                break
    data = int(input_data[0])
    # 检验第 index_one + 1 个输入值 ---- index_one + 1最大为 输入值的总个数
    # 因为首位不用检验
    index_one = 1
    # 最少插入数
    index_number = 0
    while big_distant:
        # 如果最后一个值也检验成功了,那么就说明等差数列构建成功了
        if index_one == len(input_data):
            result = index_number
            break
        # 下一个值是上一个值加公差
        data = data + big_distant
        # 如果值小于当前检验的值,所以该值是要插入的
        if data < int(input_data[index_one]):
            # 插入数加1
            index_number += 1
        # 如果值等于当前检验的值,该值检验成功,进而检验下一个输入值
        elif data == int(input_data[index_one]):
            index_one += 1
        # 大于 检验失败 
        else:
            # 公差值减1
            big_distant -= 1
            # 初始化各个指标
            index_one = 1
            index_number = 0
            data = int(input_data[0])
print(result)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值