阿里笔试中有这么一道题:
给定有长度为n的一个数组,比如 [3,5,8],后项减去前一项做差分,最后一项直接删去;一直这样做差分,直到序列中只剩下一项,返回这一项对10**9+7取模的大小。eg输入>>>31 2 3输出>>>0
采用暴力法,无法全部通过。
通过数学观察,我发现最后的结果和数组中每一个元素都有关系,而且这些元素的系数恰好是杨辉三角形中第n行的系数,于是我编写了代码,自测+测试案例是正确的,提交后,通过率为0%,请教各位大佬,错在哪里了?
是思路错了,还是编程细节出错了?谢谢大佬们指点。
import sys n = int(input()) #n是数组的长度 data = list(map(int,input().split())) #data中读取输入的数组 if n==1: print(data[0]) elif n==2: print(data[1]-data[0]) co = [1] # co中是杨辉三角形,第n行的系数 n = n-1 for i in range(n): temp = co[i]*(n-i)/(i+1) co.append(temp) res = 0 if n%2==1: flag = -1 else: flag = 1 for i in range(len(data)): res += data[i]*flag*co[i] flag = -flag res = int(res%(10**9+7)) print(res)PS:这里面对于n==1和n==2的处理确实有瑕疵,会输出两次,那么主体的思路有无其他问题?
全部评论
(2) 回帖