要解決的問題是在一個整數串列中找到一個不重復的整數。我使用了一個 while 回圈將每個值與另一個值進行比較。但是,該函式回傳錯誤的值。這是一個 Hackerrank 挑戰,可以在這里找到。
public static int lonelyinteger(List<Integer> a) {
int lonelyInt = 0;
for (int i = 0; i < a.size(); i ) {
for (int j=1;j<a.size();j ){
while (a.get(i)!=a.get(j)){
lonelyInt =a.get(i);
}
}
}
return lonelyInt;
}
我真的很感激任何提示和/或更直接的解決方案。我是 Java 新手,正在練習我的技能。
uj5u.com熱心網友回復:
您將每個數字與所有其他數字進行比較的方法原則上是正確的。
如果我們將陣列的第i個元素與所有其他元素進行比較,并且沒有一個元素等于它,那么我們就知道它是唯一的數字。
您的程式沒有正確執行此操作。
想想這樣的回圈:
- 使用索引的外部回圈
i為我們提供了我們正在檢查孤獨的數字,a.get(i). - 使用索引的內部回圈
j給了我們每個數字來檢查外部回圈選擇的當前候選,a.get(j).
因此,對于外回圈的每次迭代,我們都需要跟蹤內回圈的任何迭代是否匹配。我們可以使用本地boolean命名equalNumberFound,我們false在外回圈的每次迭代開始時將其設定為。
在內部回圈中,我們檢查是否找到了相等的數字,如果找到了,將其設定為true. 確保你不檢查一個數字本身!
在外回圈的每次迭代結束時,我們檢查equalNumberFound,如果它仍然存在false,我們可以回傳當前的外回圈編號,因為我們現在知道沒有其他數字是相等的。
您需要查看您對while回圈的了解,因為您似乎對它們的行為方式有一些不正確的假設。
uj5u.com熱心網友回復:
解決問題的一種方法是先對串列進行排序,然后將每個元素與其相鄰元素進行比較,因為這些元素僅限于出現一次或兩次。由于只有一個元素出現一次,那么沒有相同相鄰元素的元素就是停止條件。這種方法實作了 O(log(N)) 時間復雜度和 O(1) 空間復雜度。
public static int lonelyInteger(List<Integer> a) {
Collections.sort(a);
for (int i = 1; i < a.size(); i = 2) {
if (a.get(i - 1).intValue() != a.get(i).intValue()) return a.get(i - 1);
}
return a.get(a.size()-1);
}
uj5u.com熱心網友回復:
您可以使用哈希集。遍歷整數串列:
- 如果哈希集中不存在整數,則將元素添加到哈希集中。
- 洗掉整數元素,如果它已經存在于哈希集中
現在回傳散列集中唯一的非重復整數。
public static int lonelyinteger(List<Integer> a) {
Set<Integer> set = new HashSet<>();
for (int n : a) {
if (set.contains(n)) {
set.remove(n);
} else {
set.add(n);
}
}
return set.stream().findFirst().get();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/426716.html
