我正在尝试编写一个函数,该函数获取整数列表并查找其中的所有算术序列。
if(isset($_POST['openpayslip'])){
if(!file_exists('payslips/'.$_SESSION['username'].'.pdf')){
echo "Payslip or function does not exist";
}
if(file_exists('payslips/'.$_SESSION['username'].'.pdf')){
header('Location: payslips/'.$_SESSION['username'].'.pdf');
}
}
此列表中有五个算术序列:A = [-1, 1, 3, 3, 3, 2, 1, 0]
- 这些是序列的第一个和最后一个元素的索引。序列是由元素之间的差异导出的。
从上面的例子中可以看出 - 序列必须长于2个元素(否则它会在每两个元素之间找到一个序列)。
我需要编写的函数必须返回它在列表中找到的序列数 - 在这种情况下它应该返回5.
我有点陷入困境 - 尝试了几种不同的方法但却失败了。我最近做的事情是:
(0, 2), (2,4), (4, 6), (4,7), (5,7)
我用迭代X弄乱了一些东西,此时,这是一个无限循环。
答案 0 :(得分:1)
也许你可以使用这样的逻辑 -
>>> A = [-1, 1, 3, 3, 3, 2, 1, 0]
>>> def indices(l):
... res = []
... for i in range(0,len(l)-2):
... diff = l[i+1] - l[i]
... for j in range(i+2,len(l)):
... if (l[j] - l[j-1]) == diff:
... res.append((i,j))
... else:
... break;
... return res
...
>>> indices(A)
[(0, 2), (2, 4), (4, 6), (4, 7), (5, 7)]
答案 1 :(得分:1)
蛮力方法是检查每个切片> len 3,对于每个切片,您只需要减去第一个和最后一个元素以获得差异,并查看所有a[i+1] - A[i]
是否等于差异:
def is_arith(x):
return all(x[i + 1] - x[i] == x[1] - x[0]
for i in range(len(x) - 1))
def arith_count(A):
return sum(is_arith(A[i:j])for i in range(len(A))
for j in range(i + 3,len(A)+1))
更高效的版本:
def arith_sli(A):
n = len(A)
st,tot = 0, 0
while st < n - 2:
end = st + 1
dif = A[end] - A[st]
while end < n - 1 and A[end + 1] - A[end] == dif:
end += 1
ln = end - st + 1
if ln >= 3:
tot += (ln - 2) * (ln - 1) // 2
st = end
return tot
tot += (ln - 2) * (ln - 1) // 2
是可以为任何长度级数&gt; = 3形成的切片的最大数量,我们设置st = end
因为没有进度可以重叠。
两者都返回正确的输出,后者的效率要高得多:
In [23]: A = [-1, 1, 3, 3, 3, 2, 1, 0]
In [24]: arith_sli(A)
Out[24]: 5
In [25]: arith_count(A)
Out[25]: 5
In [26]: A = [-1, 1, 3, 3, 4, 2, 1, 0,1,2]
In [27]: arith_sli(A)
Out[27]: 3
In [28]: arith_count(A)
Out[28]: 3