2016-04-29 1 views
1

行き方: はint[] x及びパーセンテージP(0から100)を考えるとは、少なくともパーセンテージxp要素以下であるので、最小値の要素xyを見つけますy。ここでJavaの「フラクタイル」メソッド戻り間違った出力

Example 1: 
x = {-3, -5, 2, 1}, p = 50 
Method should return -3 
Reason: 50% of the elements in x are less than or equal to -3: -5 and -3 

Example 2: 
x = {7, 9, 2, -10, -6}, p = 50 
Method should return 2 
Reason: 60 percent of the elements in x are less than or equal to 2: 2, -10 and -6 
-6 would be wrong because only 40% of the elements are less than or equal 
(100% of the elements are less than or equal to 9, but that isn't the smallest value) 

Example 3: 
x = {1,2,3,4,5,6,7,8,9,1,2,3,4,5,7,9,5,43,124,94}, p = 0 
Method should return 1 
Reason: Only 0% is needed, so in theory any number will do, but 1 is the smallest value 

私はこれまでの方法のために書かれたものです:

public static int fractile(int[] x, int p) 
    { 
     int smallestInt = x[0];    
     for (int i = 0; i < x.length; i++) { 
     int testNum = x[i]; 
     int percentage; 
     int count = 0; 
     for (int j = 0; j < x.length; j++) { 
      if (x[j] <= testNum) 
       count++; 
     } 
     percentage = (count/x.length) * 100; 
     if (testNum <= smallestInt && percentage >= p) 
      smallestInt = testNum; 
     } 
     return smallestInt; 
    } 

しかし、私のサンプル数のための私の出力が間違って出てくる:

INPUT: 
[6, 5, 4, 8, 3, 2] 
40% 
Method returns: 6 
INPUT: 
[7, 5, 6, 4, 3, 8, 7, 6, 9, 10] 
20% 
Method returns: 7 
INPUT: 
[3, 4, 2, 6, 7, 5, 4, 4, 3, 2] 
60% 
Method returns: 3 

それはほとんどですあたかも最初のインデックスをつかんでいて、それの背後にある数字を見ないかのように私は理由を理解できません。

私は間違っていますか?ラインで

+1

最大の問題があるかもしれないあなたの初期化ライン 'int型smallestInt = X [0];'。これは単に間違っています。 'int smallestInt = Integer.MAX_VALUE'のようなものに置き換えてください。 – Floris

+1

Robert、最高指数または最高値を意味しますか? – Floris

+1

以下のコメントと回答の一部に記載されているように、パーセント計算を修正する必要があります。 – Floris

答えて

3

%をdouble/floatに変更し、double/floatにも分割する変数の1つをキャストします。以下のような

何か:

double percentage=0.0; 
... 
percentage = ((double)count/x.length) * 100; 

だから式はダブル/ floatを返します。

- プリミティブ型の

数値昇格のルール

  1. 二つの値が異なるデータ型の場合、Javaは自動的に二つのデータの大きい方への値のいずれかを推進していきますタイプ。

  2. 値の1つが整数でもう1つが浮動小数点の場合、Javaは自動的に浮動小数点値のデータ型 に整数値を昇格させます。

  3. byte型、short型、char型のより小さいデータ型は、オペランドのどちらもintでなくても、Javaバイナリ算術 演算子で使用されると、いつでもintに昇格します。

  4. すべてのプロモーションが実行され、オペランドのデータ型が同じになると、結果の値は、 昇格されたオペランドと同じデータ型になります。ジャンヌBoyarsky &スコットSelikoffによって

- OCAの研究ガイドあなたが必要なもの

+0

これは私の最初の2つの出力に役立ちました。私が3番目の部分に着いたとき、それは "4"を返すべきだったときに "3"を返しました。これは、数字の60%が3以下ではなく、40%にすぎないためです。 {2、2、3、3、4、4、5、6、7} –

+1

これは初期化によるものです。それも修正してください! – Floris

+0

私はそれをどのように修正するための推奨事項がありますか?あなたが提案したMIN_VALUEのアイデアは私にとっては役に立たなかった。他の誰かが最初に配列をソートすることを提案しました - これは必要ですか? –

2

percentage = (count/x.length) * 100; 

カウントとx.length両方整数です。したがって、それらを除算すると浮動小数点数ではなく整数値になります。パーセンテージには0または100が含まれ、その間には値は含まれません。

+0

キャストして(int)これを修正するか、結果が不正確になるか? –

+0

私はこれを試しても、同じ出力を返します。私はこれが問題であるとは確信していません。 –

+1

これは問題の一部です。参照してください[このような質問](http://stackoverflow.com/questions/4377842/how-can-i-convert-integer-into-float-in-java) – Floris

1

は、与えられた割合の配列のパーティションを作る選択アルゴリズムです。

シンプルで速い1はQuickSelect

であり、私はあなただけ掛けることができ、最低から最高にソートされているアレイの場合C++ std::nth_element

1

のようなJavaですぐに使用可能な実装があることを疑います検索された要素の正しいインデックスを取得するためのパーセンテージで長さを指定します。もっとに関する情報

public static int fractile(int[] x, double p){ 
    Arrays.sort(x);  
    int k = (int) Math.ceil(x.length*p)-1; 
    return x[k]; 
} 
0

あなたのコードが短くなります

Quantilesのためにあなたは試みることができる:これは、配列を操作することが許可されていると仮定し

public static int fractile(int[] x, int p) 
    { 
     Arrays.sort(x); 
     return x[Math.max((int) Math.ceil(x.length/100.0 * p) - 1, 0)]; 
    } 

。配列をソートすると、ほとんどの場合、それを簡単に操作できます。アレイが何らかの理由でそのまま残らなければ、これは機能します。

このコードは配列をソートします。最初の入力 'p'は、探しているパーセンテージを示しているため、配列内のおおよその位置を見てそこに格納されている値を返します。

0

は、私はその問題に別の実装を持っている:

public static void main(String args[]){ 
 
\t \t int[] a1 = {-3,-5,2,1}; 
 
\t \t int[] a2 = {7,9,2,-10,-6}; 
 
\t \t int[] a3 = {1,2,3,4,5,6,7,8,9,10}; 
 
\t \t int[] a4 = {1,2,3,4,5,6,7,8,9,1,2,3,4,5,7,9,5,43,124,94}; 
 
\t \t int[] a5 = {1}; 
 
\t \t int p = 50; 
 
\t \t System.out.println(fractile(a1, p)); 
 
\t } 
 

 
\t private static int fractile(int[] x, int p) { 
 
\t \t Arrays.sort(x); \t \t 
 
\t \t double value0 = x.length/100.0 * p; 
 
\t \t double value1 = Math.ceil(value0); 
 
\t \t int value2 = (int)value1; 
 
\t \t int value3 = value2 - 1; 
 
\t \t int value4 = Math.max(value3, 0); 
 
\t \t return x[value4]; 
 
\t }