顺丰2020.8.29前端开发类笔试编程题第二题

顺丰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)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值