返回给定列表中未出现的最小正整数

问题描述

编写一个函数,该函数给定一个由N个int组成的A数组,该函数返回A中不出现的最小的正数(大于0)。

enter image description here

我决定通过对列表进行排序后遍历列表来解决此问题。 当前元素的值将与下一个元素的值进行比较。由于列表是已排序的,因此列表应顺序排列直到结尾。 但是,如果有一个跳过的数字,则表示列表中未出现的最小数字。 如果它一直持续到最后,那么您应该在最后一个元素的值上加上一个

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...