2017-08-31 5 views
-1

シナリオ:配列を使用せずにn個の値の中央値を見つける方法(または配列またはリストを使用するリストまたはその他のコレクション/関数)

ユーザはN(値の数) の後にNの値を入力することになっています。

メディアンを出力するにはどうすればよいですか?

+0

ユーザ入力 'n' の場合は、最初の、あなただけのn/2または(N/2)+1の前にすべての入力を無視することができます –

+4

(問題を解決しようと努力している擬似試行も歓迎です) –

+1

@LeventeSzabó数字がソートされている場合のみ –

答えて

0

少なくともN/2か所以上のストレージが必要です。その周りに方法はありません。 OPのCOMENT後に編集

は、ESP、プログラミング上のいくつかの良いコースを取得します。データ構造。すべてのあなたの開発者のキャリアのためにStackoverflowに依存することはできません;-)。ここでArrayListを使用したいと思います。

int n = ...; // get N from the user; 
List<Double> list = new ArrayList<Double>(); 
for (int i=0; i<n; i++) { 
    double element = ...; // get element from the user; 
    list.add(element); 
} 
// Have the Java library sort the list for you 
Collections.sort(list); 
// now pick/compute the median from the sorted list 
// I'll leave that up to you.. 
+0

はい、これは値を保持するための問題と同じくらい論理的な問題ではありません。私は本当にそれを理解していない。しかし、私はそれを解決したい:) –

+1

それは浮気です。 :-)もちろん 'ArrayList'はシーンの裏側に配列を使います。 –

+0

もちろん、それは浮気です。しかし、どちらか一方の方法を不正にすることなく問題を解決する方法はありません。もちろん、ソートされたコレクションやソート可能なコレクションがあれば、ArrayListは便利です。 –

2

プログラムをバイナリツリーに渡すことをお勧めします。あなたはおそらく重複を許可する必要があります、Javaの内蔵TreeSetではできません。また、ネット上の適切なツリーの実装を見つけることができるかもしれません。ツリーをソートする必要があります。より多くのインスピレーションのためにBinary search tree on Wikipediaを参照してください。

あなたのメインプログラムは、数字を1つずつ読み込んでツリーに挿入します。その後、Nが偶数の場合、中間要素、または2つの中間要素をツリーに問い合わせます。

ツリーを実装するための配列は必要ありません。 i番目の要素を見つけるために、ツリーは遭遇した要素をトラバーサルでカウントし、i番目の要素を返すinorderを実行します。

ハッピーコーディング。

2

Arrayなし、List、またはその他のCollectionなし。

try (Scanner scanner = new Scanner(System.in)) { 
     System.out.print("Number of numbers: "); 
     int N = scanner.nextInt(); 
     System.out.printf("Enter the %d numbers: ", N); 
     double median = IntStream.range(0, N) 
       .mapToDouble(i -> scanner.nextDouble()) 
       .sorted() 
       .skip((N-1)/2) 
       .limit(2-N%2) 
       .average() 
       .getAsDouble(); 
     System.out.printf("The median is %f%n", median); 
    } 

.sorted()カーテンの後ろにいる人に注意を払うん。)

+0

私はその人を無視します。 ;-) –

+0

私はちょっと試しましたが、それは有効な入力のためにうまくいきます。非常にエレガントなソリューション。 –

関連する問題