Java实现:返回缺失数组的长度(Codewars任务)
没问题,我来帮你梳理这个Codewars任务的解决思路,再给你写个可运行的实现方案!
问题回顾
先把任务要求明确下来:
给定一个数组的数组,将这些数组按长度排序后,其长度值为连续整数,但其中缺失了一个数组。需要编写一个方法,返回该缺失数组的长度。示例:[[1, 2], [4, 5, 1, 1], [1], [5, 6, 7, 8, 9]] --> 3。若输入的数组的数组为null/nil或空,方法需返回0;若其中存在null或空数组,方法也需返回0。
解决步骤
这类问题的核心是先处理边界异常,再解决核心计算逻辑:
- 边界条件处理:
- 如果输入的外层数组是
null或者空数组,直接返回0 - 遍历每个子数组,只要发现有
null或者空的子数组(长度为0),也直接返回0
- 如果输入的外层数组是
- 核心计算逻辑:
- 提取所有合法子数组的长度,形成一个长度列表
- 找到这个列表的最小值
min_len和最大值max_len——因为原本的长度是连续整数(仅缺一个),所以完整的连续序列范围就是从min_len到max_len - 用等差数列求和公式计算完整连续序列的长度总和:
(首项 + 末项) * 项数 / 2,这里的项数是max_len - min_len + 1 - 计算当前长度列表的总和,两者的差值就是缺失的那个长度——完整序列总和减去现有总和,刚好就是少了的那个数
代码实现(Python为例)
def find_missing_length(arr): # 处理输入为空或null的情况 if not arr: return 0 # 检查每个子数组是否合法(非null且非空) for sub_arr in arr: if sub_arr is None or len(sub_arr) == 0: return 0 # 提取所有子数组的长度 lengths = [len(sub) for sub in arr] min_len = min(lengths) max_len = max(lengths) # 计算预期的连续序列总和和实际总和 expected_total = (min_len + max_len) * (max_len - min_len + 1) // 2 actual_total = sum(lengths) # 差值就是缺失的长度 return expected_total - actual_total
测试验证
拿题目示例测试:
输入:[[1, 2], [4, 5, 1, 1], [1], [5, 6, 7, 8, 9]]
提取的长度列表是[2,4,1,5],min为1,max为5
预期总和:(1+5)*5//2 = 15
实际总和:2+4+1+5 = 12
差值是15-12=3,和题目示例结果一致,正确。
边界情况测试:
- 输入
[]或None,返回0 - 输入
[[1], None, [2,3]],返回0 - 输入
[[], [1]],返回0
内容的提问来源于stack exchange,提问作者Michał Lewaszow
相关产品推荐
相关产品推荐

