Java Puzzle – Верните все строки с N-й наибольшей длиной

1. Проблема

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

Например, в следующем списке n=1 вернет [Интервью], а n=2 вернет [Самое длинное, Содержит].

list = [Yuri, Ron, Interview, Longest, List, Contain]9 Chars - Interview7 Chars - Longest, Contain4 Chars - Yuri, List3 Chars - Ron

Хотя решение «Как найти k-й по величине элемент в несортированном массиве длины n за O(n)?» можно применить к длине строки, как выполнить обратный перевод, чтобы вывести все строки длиной n?

2. Решение

Я написал простую программу Java, которая находит «все N-ные самые длинные элементы» из списка строк. Она использует TreeMap для хранения длины слов в качестве ключа Map и всех строк похожей длины в List в качестве значения Map.

import java.util.ArrayList;import java.util.List;import java.util.TreeMap;public class NthLongestStringAlgorithm {public static void main(String[] args) {List<String> list = List.of("Yuri", "Ron", "Interview", "Longest", "List", "Contain");for(int i=1; i<=4; i++){System.out.println("Words with " + i + "th length: " + findNthLongestElement(list, i));}}private static List<String> findNthLongestElement(List<String> list, int n) {if(n < 1) {return null; //Handle invalid case}TreeMap<Integer, List<String>> map = new TreeMap<>();for(String str : list) {Integer length = str.length();List<String> tempList = map.get(length) != null ? map.get(length) : new ArrayList<String>();tempList.add(str);map.put(length, tempList);}return map.get(map.descendingKeySet().toArray()[n - 1]);}}

Вывод программы:

Words with 1th length: [Interview]Words with 2th length: [Longest, Contain]Words with 3th length: [Yuri, List]Words with 4th length: [Ron]

Исходный код на Github

Прокрутить вверх