连续整数的最大长度
题目
输入一个整数的 Numpy 数组,返回其中连续整数子数组的最大长度。例如,输入 [1,2,5,6,7],[5,6,7]为具有最大长度的连续整数子数组,因此输出3;输入[3,2,1,2,3,4,6],[1,2,3,4]为具有最大长度的连续整数子数组,因此输出4。请充分利用 Numpy 的内置函数完成。(提示:考虑使用 nonzero, diff 函数)
程序
import numpy as np
def my_func1(input):
print('input', input, ' 长度:', len(input))
# a
a = np.append(np.array([1]), np.diff(input)) # 第一步先将输入数组和数组前一个值做差,由于第一个一个数一定连续,所以添加1到第一个元素
print('a', a, ' 长度:', len(a))
# b
b = a - 1
print('b', b, ' 长度:', len(b))
# b[-1] += 1
# c
c = np.append(b, np.array([1]))
print('c', c, ' 长度:', len(c))
# d
d = np.append(np.array([0]), np.nonzero(c))
print('d', d, ' 长度:', len(d))
# e
e = np.diff(d)
print('e', e, ' 长度:', len(e))
# 结果
print(e.max())
# my_func1(np.array([1, 3, 1, 3, 4, 5, 6, 7]))
my_func1(np.array([5, 1, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7]))
思想是连续的整数相差1,将其所有元素前后相减后,再将其减1后为零,获取不为零元素的下标,将其前后相减,获取最大值就是我们要的结果。
为了防止最后一个数也为零,会把最后一个元素加一。
结果
input [5 1 2 3 4 5 6 3 4 5 6 7] 长度: 12 # 5, 1-6 , 3-7,三段连续数字
a [ 1 -4 1 1 1 1 1 -3 1 1 1 1] 长度: 12 # diff函数后,数组长度是11,添加了第一个元素 1 进去长度变为12
b [ 0 -5 0 0 0 0 0 -4 0 0 0 0] 长度: 12 # 每个元素减 1 结果
c [ 0 -5 0 0 0 0 0 -4 0 0 0 0 1] 长度: 13 # 在数组末尾添加 1,长度变成 13
d [ 0 1 7 12] 长度: 4 # 不为零元素下标
e [1 6 5] 长度: 3 # diff函数
6 # 结果
2020/12/4改正
首先多谢@带着小板凳学习的指出,先前程序如果最长的结果在末尾,会出现结果少 1 的结果。
原因是末尾没有不连续的数字发生转折,同时也是因为正整数的个数计算要加 1 问题。
例如 1 ,2,3,4,5 这总共有几个数,结果是 5-1+1 ,
类似的,由于在数字发生不连续转折处不为零,所有新连续的数字如果按照我的程序会少 1 个,中间的缺失可以由下一个不连续转折来弥补,但末尾没有转折了,于是缺了一个。解决方法是在数组末尾添加一位不为零的元素进去
后话
这个程序还是不够好,不过可以参考一下😄