顺丰2020.8.29前端开发类笔试编程题第二题【Python】
题目大概意思:一串数字中有若干不确定数,不确定数由“-1”代替,其他数都为正整数。填补数字串中的不确定数,使其形成拥有等差数列个数最少的数字串。
大体思路:先填补,再计算等差数列的个数。填补时,分为九种情况如下:
代码如下:
"""
action:填补数字串,计算数字串中的等差序列个数(顺丰2020.8.29第二道编程题)
date:2020/8/31
author:缘缘桑
"""
#输入数字串中包含数字个数
m = int(input().strip())
#输入数字串
nums = input().strip()
list1 = nums.split(" ")
#将字符型数字换成整型
for i in range(len(list1)):
list1[i] = int(list1[i])
i = 0
#求数字串中每个“-1”串的边界,开始位置和结束位置
first = []
last = []
while i < len(list1):
if (list1[i] == -1 and i == 0) or (list1[i] == -1 and list1[i-1] != -1):
first.append(i)
if (list1[i] == -1 and i == len(list1)-1) or (list1[i] == -1 and list1[i+1] != -1):
last.append(i)
i = i + 1
print(first)
print(last)
#填补每个“-1”串的值,共有九中情况
for k in range(len(first)):
if first[k] == 0 and last[k] == len(list1) - 1:
for x in range(first[k],last[k]+1):
list1[x] = 1
if first[k] == 0 and last[k] == len(list1) - 2:
for x in range(first[k],last[k]+1):
list1[x] = list1[len(list1)-1]
if first[k] == 0 and last[k] <= len(list1) - 3:
if list1[last[k]+1] != -1 and list1[last[k]+2] != -1:
a = list1[last[k]+2] - list1[last[k]+1]
b = list1[last[k]+1] - a*(last[k]-first[k]+1)
if b > 0:
for x in range(first[k], last[k] + 1):
list1[x] = list1[last[k]+1] - a*(last[k]+1-x)
if b <= 0:
for x in range(first[k], last[k] + 1):
list1[x] = 1
if list1[last[k]+1] != -1 and list1[last[k]+2] == -1:
b = list1[last[k] + 1] - (last[k] - first[k] + 1)
if b > 0:
for x in range(first[k], last[k] + 1):
list1[x] = list1[last[k] + 1] - (last[k] + 1 - x)
if b <= 0:
for x in range(first[k], last[k] + 1):
list1[x] = 1
if first[k] == 1 and last[k] == len(list1) - 1:
for x in range(first[k],last[k]+1):
list1[x] = list1[first[k]-1]
if first[k] == 1 and last[k] == len(list1) - 2:
if ((list1[last[k]+1] - list1[first[k]-1])%(last[k]-first[k]+2)) == 0:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k]-1]+int(((list1[last[k]+1] - list1[first[k]-1])/(last[k]-first[k]+2)))*(x-first[k]+1)
else:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k] - 1]
if first[k] == 1 and last[k] <= len(list1) - 3:
if list1[last[k]+2] != -1 and list1[last[k]+1] != -1:
a = list1[last[k]+2] - list1[last[k]+1]
b = (list1[last[k]+1] - list1[first[k]-1])/(last[k]-first[k]+2)
c = (list1[last[k] + 1] - list1[first[k] - 1]) % (last[k] - first[k] + 2)
if a == b:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k]-1]+a*(x-first[k]+1)
elif c== 0:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k]-1]+int(b)*(x-first[k]+1)
else:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k] - 1]
if list1[last[k]+2] == -1 and list1[last[k]+1] != -1:
b = (list1[last[k] + 1] - list1[first[k] - 1]) % (last[k] - first[k] + 2)
if b == 0:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k] - 1] + ((list1[last[k] + 1] - list1[first[k] - 1]) / (last[k] - first[k] + 2)) * (x-first[k] + 1)
else:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k] - 1]
if first[k] >=2 and last[k] == len(list1) - 1:
a = list1[first[k]-1] - list1[first[k]-2]
for x in range(first[k],last[k]+1):
list1[x] = list1[first[k]-1]+a*(x-first[k]+1)
if first[k] >=2 and last[k] == len(list1) - 2:
a = list1[first[k] - 1] - list1[first[k] - 2]
b = (list1[last[k]+1] - list1[first[k]-1])/(last[k] - first[k] + 2)
if a == b:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k] - 1] + a * (x-first[k]+1)
else:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k] - 1] + a * (x-first[k]+1)
if first[k] >=2 and last[k] <= len(list1) - 3:
a = list1[first[k] - 1] - list1[first[k] - 2]
b = (list1[last[k] + 1] - list1[first[k] - 1]) / (last[k] - first[k] + 2)
if list1[last[k]+1] != -1 and list1[last[k]+2] != -1:
c = list1[first[k] - 1] - list1[first[k] - 2]
if a == b and b == c:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k] - 1] + a * (x-first[k]+1)
if a == b and b != c:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k] - 1] + a * (x-first[k]+1)
if a != b and b == c:
for x in range(first[k], last[k] + 1):
list1[x] = list1[last[k] + 1] - a * (last[k] + 1 - x)
if a != b and b != c:
for x in range(first[k], last[k] + 1):
list1[x] = list1[x] = list1[first[k] - 1] + a * (x-first[k]+1)
if list1[last[k] + 1] != -1 and list1[last[k] + 2] == -1:
if a == b:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k] - 1] + a * (x-first[k]+1)
else:
for x in range(first[k], last[k] + 1):
list1[x] = list1[first[k] - 1] + a * (x-first[k]+1)
print(list1)
#计算数字串中等差序列的个数
def num_list(list):
flag = 1
i = 0
if m <= 2:
print(flag)
else:
while i < len(list):
a = list[i+1] - list[i]
b = list[i+2] - list[i+1]
if a != b:
flag = flag + 1
i = i + 1
if i >= len(list) - 3:
break
i = i + 1
print(flag)
num_list(list1)