我的一個朋友問我關于他們的講師作為練習給他們的編碼挑戰。我有一個解決方案來解決它。但我認為解決方案對于一個簡單的分類問題來說太長了。所以,我想問一下是否有更直接的方法來解決這個挑戰。
有一個函式third_greatest(),它接受一個字串陣列并回傳第三大單詞。因此,例如:如果陣列是 ["hello", "world", "before", "noon"],則輸出應該是 "world",因為 "before" 有六個字母長,而 "hello" 和 "world" " 都是 5,但輸出應該是 "world",因為它出現在陣列中的最后一個五個字母的單詞。如果陣列是 ["hello", "world", "after", "noon"],輸出應該是 "after",因為前三個單詞都是五個字母長,所以回傳最后一個。該陣列將至少包含三個字串,每個字串僅包含字母。
我提出的解決方案使用 HashMap 以字典方式存盤字串。Hashmap 將以 Integer 和 ArrayList 的形式存盤資料、長度和具有該長度的單詞。一旦代碼完成了對 String 陣列的迭代并將各個字串放入它們單獨的組中,我就從 Hashmap 中提取了在陣列中找到的所有鍵(長度),并按升序對它們進行排序。之后,Hashmap 的 ArrayList 中的所有值都會被轉移到另一個 ArrayList 中。最后,它將新 ArrayList 的第三個 String 回傳給函式呼叫者。
謝謝。
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Main {
public static void main (String args[]) {
String test[] = {"hello", "world", "before", "noon"};
System.out.println(third_greatest(test));
}
public static String third_greatest(String words[]) {
HashMap<Integer, ArrayList<String>> words_length = new HashMap<Integer, ArrayList<String>>();
for (String word : words) {
int length = word.length();
if (words_length.containsKey(length)) {
words_length.get(length).add(word);
} else {
ArrayList<String> temp = new ArrayList<String>();
temp.add(word);
words_length.put(length, temp);
}
}
Object keys[] = words_length.keySet().toArray();
Integer sorted[] = new Integer[words_length.size()];
for (int x = 0; x < keys.length; x ) {
sorted[x] = (Integer)keys[x];
}
Arrays.sort(sorted);
ArrayList<String> results = new ArrayList<String>();
for (int x = sorted.length - 1; x >= 0; x--) {
ArrayList<String> temp = words_length.get(sorted[x]);
for (String word : temp) {
results.add(word);
}
}
return results.get(2);
}
}
uj5u.com熱心網友回復:
對流按長度的降序排序并跳過前 2 個元素。需要 Java 11
import java.util.*;
class ThirdLongest
{
public static void main(String[] args) {
String[] words={"Word","Longer Word","Longest Word Here"};
String word=Arrays.stream(words)
.sorted((s1,s2)->Integer.compare(s2.length(),s1.length()))
.skip(2)
.findFirst()
.get();
System.out.println(word);
}
}
或者
只需按降序對陣列進行排序并回傳第三個元素
Arrays.sort(words,(s1,s2)->Integer.compare(s2.length(),s1.length()));
return words[2];
uj5u.com熱心網友回復:
正如其他人所指出的,簡單的解決方案是根據字串大小(或任何排序標準)對陣列進行排序。然后從排序串列中取倒數第三個元素。
這是一個O(NlogN)解決方案,因為排序步驟是O(NlogN).
這是一個O(N)解決方案。
- 從輸入陣列中取出前 3 個字串并對其進行排序。這個 3 的陣列將表示輸入陣列的第三個、第二個和最大的元素。
- 迭代其余的陣列元素:
- 如果元素小于當前第三大元素,則忽略它
- 除此以外:
- 將當前元素添加到 3 的陣列中。
- 把它分類
- 洗掉第一個(最小的)元素。
最后,您將執行O(N)測驗以及最多 O(N)3 或 4 個元素的陣列。對于O(N).
可以對排序步驟進行微優化,以避免回圈和不必要的陣列創建和復制。
注意:如果輸入串列總是很小,那么這個(更復雜的)解決方案不值得努力。當縮放變數具有較小的值時,具有更好的演算法復雜度并不能保證更好的性能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474611.html
