В этой задаче 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; } } }
Удачного кодирования :)
Что дальше:
- Ознакомьтесь с решением другой задачи: Сформировать наибольшее целое число из цифр, сумма которых равна целевому
- Свяжитесь со мной: [email protected]
- Хотите пройти собеседование на должность инженера-программиста? Свяжитесь со мной :)