2017-02-24 5 views
0

私は、整数の配列を受け取り、その配列の一意の値の数を返すメソッドを作成しようとしています。たとえば、配列{5、6、5、7、5、7}の場合、3つの重複(5,5,7)があるため、このメソッドは3を返します。私は間違ってどこに行ったのかわからない、変数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'ではなく' 4'と比較しています。配列内の各数値を他のすべての数値と比較する必要があります。あなたは内部のループを使ってこれを行うことができます... – brso05

答えて

0

私はこの問題を考えることが重要だと思うので、これはあなたの問題を解決するためのコードであることを行っていません。

これを行うには、リストを作成し、それをreturnListと呼び、リストを読み込むときにそのリストに要素を追加する方法があります。最初にリストに要素を追加するたびにその要素が以前に追加されていないことを確認するためにリストをチェックする必要があります。以前に追加されている場合は、要素をリストに追加せずに次の入力要素に移動します。配列全体を読み込んだら単純なreturnListの長さを返します。

これは決して効率的な方法ではないことに注意してください(毎回リストを確認する必要があります)。この問題を解決する方法の1つにすぎません。問題を解決するためのより良い方法を考えてみることをお勧めします。

幸運を祈る!

+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]では、2つの値は重複と見なされません。

この問題を解決する1つの方法は、brute forceメソッドを使用することです。つまり、forループを入れて、残りの完全な配列を通るinner forループを実行することです。私の意見では

より良い方法は、配列をスキャンし、設定に値を挿入しておくことです。スキャンが完了すると、セットの長さがあなたの答え(一意の値の数)になります。 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; 
} 
関連する問題