新型美丽数列

报名了优快云的竞赛,然鹅忘了.今天找到了最后一个题做了一下.
4、题目名称:新型美丽数列 定义美丽数列A: 1. 数列中相邻的数越是靠内相对大小加一,a[2]=a[1]+1,a[n-2]=a[n-1]+1… 2. 距离边缘距离相等的 数的大小相等:a[0] = a[n-1],a[1] = a[n-2]… 通过修改最小(小声BB,这是最少吧?)的数字使得给定数列变成美丽数列。 修改后的值必须仍是正 整数。

我的思路是截取一半的列表,然后每个数减去他所在的列表索引
比如list = [1,2,3,2,5,8,5,4,5,2,1]
先取一半list = [1,2,3,2,5,8]
减去列表索引是(log):1 1 1 -1 1 3
统计相同的次数最多的就可以知道前半个列表哪个位置上的数是排好序的
然后反转列表
统计后半列表
得到整个列表中次数最多的一个(log),
如果某个位置的值跟最多的log不同,那就需要修改

import math
import sys


def diffnum(list):
    map = {}
    for index in range(len(list)):
        map[str(index)] = str(list[index] - index)
    return map

def countnum(map):
    map1 = {}
    for key,value in map.items():
        if value in map1.keys():
            map1[str(value)] = map1[str(value)] + 1

        else:
            map1[str(value)] = 1
    return map1


list = [1,2,3,2,5,8,5,4,5,2,1]

split_num = math.ceil(len(list) / 2)

left_list_num = diffnum(list[0:split_num])

left_list_count = countnum(left_list_num)

list_re = list[::-1]

right_list_num = diffnum(list_re[0:split_num])

right_list_count = countnum(right_list_num)

sum_map = left_list_count.copy()

for key,value in right_list_count.items():
    if key in sum_map.keys():
        sum_map[key] = sum_map[key] + value
    else:
        sum_map[key] = value

max_value = sorted(sum_map.values())[-1]

log = sys.maxsize

for key,value in sum_map.items():
    if max_value == value:
        log = key
        break

if log == sys.maxsize:
    print("错误")
    exit(1)

count = 0


for key,value in left_list_num.items():
    if value != log :
        list[int(key)] = list[int(key)] + (int(log) - int(value))
        count = count + 1


list = list[::-1]

num_log = 0

if len(list) % 2 !=0:
    num_log = 1

for key,value in right_list_num.items():
    if num_log == 1 and key == str(split_num-1):
        break
    if value != log :
        list[int(key)] = list[int(key)] + (int(log) - int(value))
        count = count + 1

print(count)
print(list)

最后的结果
我也不知道对不对,没有测试环境,希望各位大神看下

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值