Максимальное число формируется из массива списка целых

1

Задача: задайте список не отрицательных целых чисел, расположите их так, чтобы они составляли наибольшее число.

Мой подход:

public class Solution implements Comparator<Integer>{
    public String largestNumber(final List<Integer> A) {
        List<Integer> B = A;
        Collections.sort(B);
        String ans = "";
        for(int i=B.size()-1;i>=0;i--)
            ans = ans+Integer.toString(B.get(i));
        return ans;
    }
    public int compare(Integer a,Integer b){
        String as = Integer.toString(a);
        String bs = Integer.toString(b);
        String fe = as+bs;
        String se = bs+as;
        return (fe.compareTo(se));
    }
}

Возникающие проблемы: для A = [3, 30, 34, 5, 9] показан выходной сигнал 3430953, но ожидаемый выход равен 9534330.

Из того, что я вижу, список массивов сортируется нормально, не используя собственный метод compare(). Почему это происходит?

  • 0
    Collections.sort() принимает Comparator в качестве аргумента.
  • 0
    Примечание: это ОЧЕНЬ неэффективный компаратор для целых чисел. Использование строковых методов может быть менее многословным, но для чисто числовых вычислений ужасно неэффективно.
Теги:
arrays
arraylist
sorting

2 ответа

3

Где у вас это есть:

Collections.sort(B);

вы сортируете с естественным порядком элементов, потому что вы не указываете компаратор.

Поскольку вы находитесь внутри класса Solution и реализуете Comparator<Integer>, вы, вероятно, имеете в виду:

Collections.sort(B, this);

поэтому вы фактически будете использовать задание, которое вы определили.

1

Версия Python:

import functools
from functools import cmp_to_key

num=[3, 30, 34, 5, 9]

def compare(n1, n2):
    if n1 + n2 > n2 + n1:
        return 1
    elif n1 + n2 < n2 + n1:
        return -1
    else:
        return 0

num_str = [str(n) for n in num]
res = ""
print(num_str)

res=""
for n in sorted(num_str,key=functools.cmp_to_key(compare),reverse=True) :
            res += n

print(res)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню