Получить максимальное значение, расположив номера различных цифр - PullRequest
0 голосов
/ 02 июля 2019

Я пытался написать функциюgest_number (), которая может вывести максимальное значение, упорядочив порядки списка заданных чисел (например, 21,2 должно дать 221. 543,5432,1 должно дать 54354321). Это домашняя задача, которую я тестировал во многих случаях, но не получил неправильного ответа. Однако система оценок постоянно говорила мне, что у меня неправильный вывод (не показывая результат на их конце). Я подозреваю, что есть небольшой кусочек кода, который приводил к неправильному выводу в некоторых особых случаях, но я не смог его найти.

    #Uses python3
    #%%

    import functools


    def greater(str1, str2):

        if str1==str2:
            return 1 


        for i in range(min(len(str1),len(str2))):

            if str1[i]>str2[i]:
                return 1

            if str1[i]<str2[i]:
                return -1


        if len(str1)>len(str2):
            if str1[len(str1)-len(str2)-1]>str1[0]:
                return 1
            else:
                return -1

        if len(str1)<len(str2):
            if str2[len(str2)-len(str1)-1]>str2[0]:
                return -1
            else:
                return 1

    def largest_number(a):

        a=list(map(str,a))
        a_sorted=sorted(a,key=functools.cmp_to_key(greater),reverse=True)
        largest=int(''.join(a_sorted))
        return(largest)


    #test cases:
    largest_number([21,2])
    largest_number([543,5432,1])

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Логика в greater не совсем верна, когда речь идет о случае, когда одна строка является левой подстрокой другой:

    if len(str1)>len(str2):
        if str1[len(str1)-len(str2)-1]>str1[0]:
            return 1
        else:
            return -1

Здесь вы неправильно справляетесь со случаем, когда str1[len(str1)-len(str2)-1] равно str1[0]. В этом случае вы должны выполнить итерацию дальше, увеличив индекс в обеих строках (так же, как вы делали в первой части алгоритма). Поэтому измените приведенный выше код на:

    if len(str1)>len(str2):
        for i in range(len(str2),len(str1)):
            if str1[i]>str1[i-len(str2)]:
                return 1
            if str1[i]<str1[i-len(str2)]:
                return -1

... и сделайте аналогичное изменение для зеркального корпуса.

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

def cmp(a, b): # This function was included in Python 2.x, but no longer in 3.x
    return (a > b) - (a < b)

def greater(str1, str2):
    return cmp(str1 + str2, str2 + str1)
0 голосов
/ 03 июля 2019

Вы можете решить эту проблему с помощью модуля Itertools:

import itertools
import functools

#"my_list" object is a list of string objects.
def largest_number(my_list):
    answer = 0
    for i in itertools.permutations(my_list):
        x = int(functools.reduce(lambda x,y:x+y,i))
        if x > answer: 
            answer = x
    return answer

Этот код работает, потому что метод "перестановок" модуля itertools возвращает все возможные случаи комбинаций списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...