0

编写一个函数,给定一个包含 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())
4

4 回答 4

3

我建议您转换为一个集合,然后您可以有效地测试数字是否是它的成员:

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
于 2020-09-13T17:26:44.910 回答
2

您可以执行以下操作:

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
于 2020-09-13T17:28:31.020 回答
1

您可以利用集合来实现您的目标。

set.difference()方法与由 表示的相对补码相同A – B,是 A 中所有不在 B 中的元素的集合。

例子:

Let A = {1, 3, 5} and B = {1, 2, 3, 4, 5, 6}. Then  A - B = {2, 4, 6}.  

usingisNeg()方法用于检查给定集合是否包含任何负整数。

使用min()方法 onA - 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,3,6,4,1,2]))

输出:

5

输入:

print(retMin([-2,-6,-7]))

输出:

1

输入:

print(retMin([23,25,26,28,30]))

输出:

24
于 2020-09-13T18:13:52.957 回答
0

尝试使用以下代码,您应该能够解决您的问题:

def test():
  arr = [3,-1,23,26,25,24,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函数,我将得到其中的最小值。如果你愿意,你可以在这里测试

于 2020-09-13T17:28:46.437 回答