В этой задаче Leetcode мы переставляем слова в предложении с учетом нескольких правил:

  • Слова с меньшим количеством букв идут первыми
  • Если в словах одинаковое количество букв, они сохраняют свой первоначальный порядок в предложении.

Решение

В основном это проблема с заказом. Чтобы решить эту проблему, мы определяем Comparable класс Word, содержащий строку слов и порядок в исходном предложении.

class Word implements Comparable<Word> {
    String s;
    int ord;
        
    Word(String s, int ord) {
        this.s = s;
        this.ord = ord;
    }
        
    public int compareTo(Word w) {
        int sn = s.length();
        int wn = w.s.length();
        if (sn < wn) {
            return -1;
        } else if (sn > wn) {
            return 1;
        } else if (ord < w.ord) {
            return -1;
        } else if (ord > w.ord) {
            return 1;
        }
        return 0;
    }
}

Метод compareTo следует правилам, изложенным в условии задачи.

Затем мы используем Collections.sort для сортировки всех слов. Перед этим нам нужно разобрать слова из исходного предложения. Это можно сделать, просто разделив строку и перебрав полученный массив.

После сортировки нам нужно позаботиться о форматировании вывода, нам нужно сделать первое слово заглавным, что делается в следующем методе:

String capitalize(String s) {
    String first = s.substring(0, 1).toUpperCase();
    return first + s.substring(1);
}

Кроме того, если слово написано с заглавной буквы в исходном предложении и не является первым словом в выходном предложении, оно должно быть в нижнем регистре. Делается это по следующей логике:

w.ord == 0 ? w.s.toLowerCase() : w.s

Вот полное решение:

class Solution {
    public String arrangeWords(String text) {
        String[] words = text.split(" ");
        List<Word> lst = new ArrayList<>();
        int n = words.length;
        for (int i = 0; i < n; i++) {
            Word w = new Word(words[i], i);
            lst.add(w);
        }
        Collections.sort(lst);
        StringBuilder sb = new StringBuilder();
        sb.append(capitalize(lst.get(0).s));
        for (int i = 1; i < lst.size(); i++) {
            sb.append(" ");
            Word w = lst.get(i);
            sb.append(
                w.ord == 0
                ? w.s.toLowerCase()
                : w.s);
        }
        return sb.toString();
    }
    
    String capitalize(String s) {
        String first = s.substring(0, 1).toUpperCase();
        return first + s.substring(1);
    }
    
    class Word implements Comparable<Word> {
        String s;
        int ord;
        
        Word(String s, int ord) {
            this.s = s;
            this.ord = ord;
        }
        
        public int compareTo(Word w) {
            int sn = s.length();
            int wn = w.s.length();
            if (sn < wn) {
                return -1;
            } else if (sn > wn) {
                return 1;
            } else if (ord < w.ord) {
                return -1;
            } else if (ord > w.ord) {
                return 1;
            }
            return 0;
        }
    }
}

Удачного кодирования :)

Что дальше: