#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
Это уже учтено впоследствии 🙂