Codewars第九天–Length of missing array
题目描述:
你得到一个数组数组。
如果按长度对数组进行排序,您将看到它们的长度值是连续的。
但是缺少一个阵列!
您必须编写一个返回缺失数组长度的方法。
例如:
Example:
[[1, 2], [4, 5, 1, 1], [1], [5, 6, 7, 8, 9]] --> 3
如果数组数组为null / nil或为空,则该方法应返回0。
当数组中的数组为null或为空时,该方法也应返回0!
总会有一个缺少的元素,它的长度总是在给定的数组之间。
代码如下:这里开始困扰我的是数组合法性判断,后来发现值需要使用一个bool(i)
就可以判断数组的合法性了。
这里将输入中的每一个数组的长度存入一个列表中并排序,然后判断哪一个数不在列表中即可。
这样会多使用一个列表,同时有两个for
循环。挺复杂的。通过了所以的测试用例。
def get_length_of_missing_array(array_of_arrays):
len_array = []
if len(array_of_arrays) == None:
return 0
else:
for i in array_of_arrays:
if bool(i) != True:
return 0
else:
len_array.append(len(i))
len_array = sorted(len_array)
if len(len_array) == 0:
return 0
else:
for j in range(len_array[0], len_array[-1]):
if j not in len_array:
return j
查看别人的solution
后发现了一个最聪明的嘴阀,如下,两行代码就可以解决该问题。
这里使用了一个all()
函数:all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。 用于判断数组的合法性。
然后使用了一个map()
函数对每一个数组进行求长度。同样的存入一个数组lns
中。
最后判断lns
的合法性。他求解的方法是将lns
应该存在的所以数组的长度进行求和再减去缺失的。这样就可以直接得到结果。避免了for
循环。
元素除了是 0、空、FALSE 外都算 TRUE。
def get_length_of_missing_array(a):
lns = a and all(a) and list(map(len, a)) #list(map(len,a))可以直接构建一个a中每一个数组长度的列表。
return bool(lns) and sum(range(min(lns), max(lns) + 1)) - sum(lns)