Наименьшее недостающее целое число Python: Демонстрационная задача кодирования. Чего мне не хватает?

#python

Вопрос:

Я играю с демонстрационной задачей Кодальности. Он просит разработать функцию, которая определяет наименьшее недостающее целое число, большее нуля в массиве.

Я написал функцию, которая работает, но кодируемость проверяет ее на 88% (правильность 80%). Я не могу припомнить случаев, когда бы это не сработало.

 def solution(A):
#If there are negative values, set any negative values to zero
if any(n < 0 for n in A):
    A = [(i > 0) * i for i in A]
    count = 0
else: count = 1
#Get rid of repeating values
A = set(A) 
#At this point, we may have only had negative #'s or the same # repeated. 
#If negagive #'s, or repeated zero, then answer is 1
#If repeated 1's answer is 2
#If any other repeated #'s answer is 1
if (len(A) == 1):
    if (list(A)[0] == 1):
        return 2
    else:
        return 1
#Sort the array
A = sorted(A)
for j in range(len(A)):
    #Test to see if it's greater than zero or >= to count. If so, it exists and is not the lowest integer.
    #This fails if the first # is zero and the second number is NOT 1
    if (A[j] <= count or A[j] == 0): #If the number is lt or equal to the count or zero then continue the count
            count = count   1
    elif (j == 1 and A[j] > 1): return 1
    else: 
         return count
return count
 

Обновить:
Я довел это до 88% с исправлениями выше. Он все еще терпит неудачу с некоторыми входными данными. Я бы хотел, чтобы кодильность давала те входные данные, которые терпят неудачу. Может быть, так и будет с полной подпиской. Я просто играю с тестом.

ОБНОВЛЕНИЕ 2: Получил это на 100% с предложением Транби.

 def solution(A):
#Get rid of all zero and negative #'s
A = [i for i in A if i > 0]
#At this point, if there were only zero, negative, or combination of both, the answer is 1
if (len(A) == 0): return 1
count = 1
#Get rid of repeating values
A = set(A) 
#At this point, we may have only had the same # repeated. 
#If repeated 1's answer is 2
#If any other repeated #'s only, then answer is 1
if (len(A) == 1):
    if (list(A)[0] == 1):
        return 2
    else:
        return 1
#Sort the array
A = sorted(A)
for j in range(len(A)):
    #Test to see if it's >= to count. If so, it exists and is not the lowest integer.
    if (A[j] <= count): #If the number is lt or equal to the count then continue the count
            count = count   1
    else: 
         return count 
return count
 

Комментарии:

1. Для чего должен быть дан ответ solution([5]) ? Я думаю , что так и должно быть 1 , но ваш код возвращается 6 .

2. Можете ли вы опубликовать описание задачи здесь?

Ответ №1:

Помимо этой ошибки для len=1, вы также , например, терпите неудачу solution([0, 5]) , которая возвращается 2 .

В любом случае… Поскольку вы готовы создать набор, почему бы просто не сделать это действительно простым?

 def solution(A):
    A = set(A)
    count = 1
    while count in A:
        count  = 1
    return count
 

Комментарии:

1. самое чистое решение! но я думаю, что вы просто испортили это для ОП, который мог бы многому научиться, улучшив свое решение 😉

2. @Tranbi Может быть, но я надеюсь, что они тоже чему — нибудь научатся из этого.

3. Я об этом не подумал. Я как бы погрузился в это, обдумывая все в уме. Я добавил часть набора позже, когда понял, что Кодильность не позволит мне импортировать Numpy, и мне пришлось искать другой способ поиска уникальных значений. В тот момент я не стал переосмысливать проблему. Наверное, мне следовало это сделать. Спасибо!

Ответ №2:

Я не думаю, что это правда:

 #At this point, we may have only had negative #'s or the same # repeated. If so, then the answer is 1  the integer.
if (len(A) == 1):
    return list(A)[0] 1
 

Если A = [2] вы должны вернуть 1, а не 3.

Однако ваш код довольно запутан. Я думаю, вы могли бы заменить

 if any(n < 0 for n in A):
    A = [(i > 0) * i for i in A]
 

с

 A = [i for i in A if i > 0]
 

Какой смысл сохранять 0 значений?

Ответ №3:

Я не думаю, что в этом есть необходимость:

если (len(A) == 1): если (список(A)[0] == 1): возврат 2 еще: возврат 1

Это уже учтено впоследствии 🙂