报名了优快云的竞赛,然鹅忘了.今天找到了最后一个题做了一下.
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)
我也不知道对不对,没有测试环境,希望各位大神看下