при использовании if l oop против l oop, почему if-l oop сломался раньше - PullRequest
1 голос
/ 01 мая 2020

Я пытался решить проблему поиска подпоследовательности массива, в которой сумма старших элементов больше, чем у остальных элементов, например:

[4, 3, 10, 9, 8 ] равен [10, 9], потому что их сумма больше, чем [4, 3, 8]

(всю проблему можно найти здесь )

Для моего кода после сортировки чисел в не убывающем порядке я начал с if l oop:

        sorty = []
        i = 0


        for n in nums:
            if sum(sorty) <= sum(nums):
                sorty.append(nums[-1])
                nums.pop()
            else: 
                break

        return sorty

Но это не сработало для массива, подобного [8, 8], потому что вывод был sorty = [8], nums = [8] вместо sorty = [8, 8]. Вместо этого я использовал какое-то время l oop. Я не понимаю, поскольку if l oop должен продолжать работать, даже если первый список равен второму списку, так почему же он остановился после того, как сумма двух списков была равна? Я использовал операнд <=. </p>

Есть ли какая-то основная разница, присущая циклам if vs while, которые я пропускаю?

1 Ответ

2 голосов
/ 01 мая 2020

Вы перебираете массив, который вы модифицируете. Создание диапазона с начальной длиной для использования в качестве итератора должно работать во избежание непредвиденного поведения:

sorty = []
i = 0
for n in range(len(nums)):
            print(n)
            if sum(sorty) <= sum(nums):
                sorty.append(nums[-1])
                nums.pop()
            else: 
                break

return sorty
...