连续整数的最大长度

连续整数的最大长度

题目

输入一个整数的 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 个,中间的缺失可以由下一个不连续转折来弥补,但末尾没有转折了,于是缺了一个。解决方法是在数组末尾添加一位不为零的元素进去

后话

这个程序还是不够好,不过可以参考一下😄

### 回答1: 可以使用位运算符来实现这个功能。具体的方法是,将给定的整数转换为二进制形式,然后遍历这个二进制数,统计连续0的最大长度即可。 以下是一个示例代码: ```c #include <stdio.h> int maxZeroLength(int n) { int maxLen = 0; int curLen = 0; while (n > 0) { if ((n & 1) == 0) { curLen++; } else { maxLen = (curLen > maxLen) ? curLen : maxLen; curLen = 0; } n >>= 1; } return maxLen; } int main() { int n = 1012; printf("Max length of consecutive zeros in %d: %d\n", n, maxZeroLength(n)); return 0; } ``` 输出结果为: ``` Max length of consecutive zeros in 1012: 3 ``` 这表示1012的二进制形式中,最长的连续0长度为3。 ### 回答2: 要连续0的最大长度,可以通过使用C语言编写一个函数来实现。这个函数的输入参数是一个正整数数组和数组的长度,输出是连续0的最大长度。 首先,我们定义一个变量max_len用来存储连续0的最大长度,初始值为0。定义另外一个变量cur_len用来存储当前连续0的长度,初始值为0。 然后,我们遍历给定的正整数数组。对于数组中的每个元素,首先判断它是否为0。如果是0,则将cur_len加1;如果不是0,则将cur_len重置为0。然后,判断cur_len是否大于max_len,如果是,则更新max_len的值为cur_len。 最后,返回max_len作为结果。 下面是一个示例的C语言代码: ```c #include <stdio.h> int maxZeroLength(int arr[], int len) { int max_len = 0; // 连续0的最大长度 int cur_len = 0; // 当前连续0的长度 for (int i = 0; i < len; i++) { if (arr[i] == 0) { cur_len++; } else { cur_len = 0; } if (cur_len > max_len) { max_len = cur_len; } } return max_len; } int main() { int arr[] = {1, 0, 0, 0, 1, 0, 0, 1}; int len = sizeof(arr) / sizeof(arr[0]); int result = maxZeroLength(arr, len); printf("连续0的最大长度为: %d\n", result); return 0; } ``` 以上代码会输出连续0的最大长度为 3,因为数组中有三个连续的0。 ### 回答3: 在C语言中,可以通过遍历一个包含0和非0元素的数组,连续0的最大长度。具体的实现如下: 1. 首先,定义一个整型数组,并初始化该数组。例如: ```c int arr[] = {1, 0, 0, 0, 2, 0, 0, 3, 4, 0, 0}; ``` 2. 接下来,定义两个变量,分别表示当前连续0的长度最大连续0的长度。初始时,当前连续0的长度最大连续0的长度都设为0。例如: ```c int currentLength = 0; int maxLength = 0; ``` 3. 然后,使用循环遍历数组。在遍历过程中,如果当前元素为0,则将当前连续0的长度加1。如果当前元素非0,则将当前连续0的长度复位为0,并更新最大连续0的长度。例如: ```c for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { if (arr[i] == 0) { currentLength++; } else { if (currentLength > maxLength) { maxLength = currentLength; } currentLength = 0; } } ``` 4. 最后,遍历结束后,还需要再次比较当前连续0的长度最大连续0的长度,并更新最大连续0的长度。例如: ```c if (currentLength > maxLength) { maxLength = currentLength; } ``` 5. 最终,最大连续0的长度存储在变量maxLength中。可以在程序中使用该值进行后续操作。例如: ```c printf("连续0的最大长度为:%d\n", maxLength); ``` 通过以上方法,即可在C语言中出给定数组中连续0的最大长度
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值