2017-02-24 65 views
0

我正在嘗試編寫一個接受整數數組並返回該數組中唯一值數的方法。例如,對於數組{5,6,5,7,5,7},該方法返回3,因爲有3個重複項(5,5,7)。我不確定我出錯的地方,我嘗試創建一個變量list,這樣當我打電話給numUnique(list)時,它會給我我的答案,但這似乎不起作用。有什麼建議麼?查找用戶輸入數組中唯一值的數

代碼:

import java.util.Scanner; 

public class Unique_Values { 
public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    int n = sc.nextInt(); 
    int[] list = new int[n]; 
    System.out.printf("%d%n ", list); 
} 

public static int numUnique(int[] list) { 
    if (list.length == 0) { 
     return 0; 
    } else { 
     int count = 1; 
     for (int i = 1; i < list.length; i++) { 
      if (list[i] != list[i - 1]) { 
       count++; 
      } 
     } 
     return count; 
    } 
    } 
} 
+3

「似乎並沒有工作「並不是一個明確的問題描述。你的意見是什麼?你期望輸出什麼? – shmosel

+1

您的方法只檢查相鄰的重複項。 – shmosel

+0

你需要一個內部循環。你只是在數字之前直接檢查元素,例如:'4545'你比較'5'到'4'而不是'5'到'5'。您需要將數組中的每個數字與所有其他數字進行比較。你可以使用內部循環來做到這一點...... – brso05

回答

0

這不會是代碼來解決你的問題,因爲我認爲思考這個問題是很重要的。

要做到這一點的一個蠻力方法是有一個列表,讓它調用returnList,並在讀入列表時向列表中添加元素。每當您想要將列表中的元素添加到列表中時應該檢查列表以確保元素之前沒有添加過。如果之前添加過,則不會將該元素添加到列表中,然後移動到下一個輸入元素中。在讀完整個數組後,簡單地返回returnList的長度,這是微不足道的。

請注意,這絕不是一種有效的方法來做到這一點(要求您每次檢查列表),並且只是解決此問題的一種方法。我懇請您嘗試思考解決問題的更好方法!

祝你好運!

+2

爲什麼你會用列表而不是集合? – shmosel

+0

再次,這不是唯一的實現,並且意在給出一個非理想的算法,迫使OP考慮如何提供更好的時間複雜度/效率。我同意你的觀點,那就是要走的路,但是我希望OP能夠自己想出來! :) – Jay

0

您的代碼將list[i]list[i - 1]進行比較,這意味着您只是檢查相鄰的重複項。要濾除所有重複項,您需要使用內部循環針對每個連續元素檢查list[i]。例如:

int count = 1; 
for (int i = 0; i < list.length - 1; i++) { 
    for (int j = i + 1; j < list.length && list[i] != list[j]; j++) { 
     if (j == list.length - 1) { 
      count++; 
     } 
    } 
} 

注意,有許多方式來配製的上方,並且有完全清潔和更有效的方法來計算不同的元件比具有內環,如在註釋中提到。

0

您的代碼if (list[i] != list[i - 1]) { count++; }只是檢查相鄰的重複項。所以在數組[5,4,5]中,這兩個五不會被認爲是重複的。

解決此問題的一種方法是使用強力方法,即嵌套for循環,inner循環通過完整的剩餘數組。

更好的方法在我看來是掃描數組,並繼續插入值設置。一旦掃描完成,該組的長度就是您的答案(唯一值的數量)。

在Java中,考慮輸入是整數列表,下面的代碼可用於:

public static int findNumberOfUniqueElements(List<Integer> list) { 
    if (list == null) { 
     return 0; 
    } 
    return (new HashSet<Integer>(list)).size(); 
} 

更通用的代碼,以適應在任何語言以下:

public static int findNumberOfUniqueElements(List<Integer> list) { 
    if (list == null) { 
     return 0; 
    } 
    Set<Integer> set = new HashSet<Integer>(); 
    for (int i=0; i<list.size(); i++) { 
     set.add(list.get(i)); // get list[i] 
    } 
    return set.size(); 
} 
0

如果您只想使用數組,

爲了找到重複條目的計數,您需要先對數組進行排序,然後比較相鄰元素,如果兩者都相同,則遞增計數。

下面是代碼:

public static int numUnique(int arr[]) 
{ 
    int dup = 0; 

    Arrays.sort(arr); 

    for(int i = 1 ; i < arr.length ; i++) 
    { 
     if(arr[i-1] == arr[i]) 
      dup++; 
    } 
    return dup; 
} 

有與使用ArrayList的

這裏一個比較簡單的方法是代碼:

public static int numUnique(int arr[]) 
{ 
    int dup = 0; 

    ArrayList<Integer> al = new ArrayList<Integer>(); 

    for(int i = 0 ; i < arr.length ; i++) 
    { 
     if(!al.contains(arr[i])) 
     { 
      al.add(arr[i]); 
     } 
     else 
      dup++; 
    } 
    return dup; 
}