问题描述
编写一个函数,该函数给定一个由N个int组成的A数组,该函数返回A中不出现的最小的正数(大于0)。
我决定通过对列表进行排序后遍历列表来解决此问题。 当前元素的值将与下一个元素的值进行比较。由于列表是已排序的,因此列表应顺序排列直到结尾。 但是,如果有一个跳过的数字,则表示列表中未出现的最小数字。 如果它一直持续到最后,那么您应该在最后一个元素的值上加上一个。
def test():
arr = [23,26,25,24,28]
arr.sort()
l = len(arr)
if arr[-1] <= 0:
return 1
for i in range(0,l):
for j in range(1,l):
cur_val = arr[i]
next_val = arr[j]
num = cur_val + 1
if num != next_val:
return num
if num == next_val: //if completes the list with no skips
return arr[j] + 1
print(test())
解决方法
我建议您转换为一个集合,然后可以有效地测试数字是否是其中的成员:
def first_int_not_in_list(lst,starting_value=1):
s = set(lst)
i = starting_value
while i in s:
i += 1
return i
arr = [23,26,25,24,28]
print(first_int_not_in_list(arr)) # prints 1
,
您可以执行以下操作:
def minint(arr):
s=set(range(min(arr),max(arr)))-set(arr)
if len(s)>0:
return min(set(range(min(arr),max(arr)))-set(arr)) #the common case
elif 1 in arr:
return max(arr)+1 #arr is a complete range with no blanks
else:
return 1 #arr is negative numbers only
,
您可以利用组合来实现您的目标。
set.difference()
方法与A – B
表示的相对补码相同,是A中所有不在B中的元素的集合。
示例:
Let A = {1,3,5} and B = {1,2,4,5,6}. Then A - B = {2,6}.
使用isNeg()
方法检查给定集合是否包含任何负整数。
在min()
上使用A - B
方法将返回设置差的最小值。
这是代码段
def retMin(arrList):
min_val = min(arrList) if isNeg(arrList) else 1
seqList=list(range((min_val),abs(max(arrList))+2))
return min(list(set(seqList).difference(arrList)))
def isNeg(arr):
return(all (x > 0 for x in arr))
输入:
print(retMin([1,6,1,2]))
输出:
5
输入:
print(retMin([-2,-6,-7]))
输出:
1
输入:
print(retMin([23,28,30]))
输出:
24
,
尝试使用以下代码,您应该可以解决问题:
def test():
arr = [3,-1,23,28]
min_val = min(val for val in arr if val > 0)
arr.sort()
l = len(arr)
if arr[-1] <= 0:
return 1
for i in range(0,l):
if arr[i] > 0 and arr[i] <= min_val:
min_val = arr[i] + 1
return min_val
print(test())
编辑
似乎您正在搜索的值比tha数组中的最小正整数小得多,而不是顺序搜索。
它的代码与仅将min_val = 1
更改为之前的代码相同:min_val = min(val for val in arr if val > 0)
,所以我要使用lambda表达式获取数组的所有正值,并在获取它们之后,使用min
函数,将获取其中的最小值。
您可以根据需要test it here