0

私はこれにしばらく取り組んできましたが、これまでのところ私のコードです。int m[] = new int[variable]配列内のアイテムの数を変更する方法や、ゼロを削除する/配列をシフトする方法がわからないため、しばらくの間、私はかなり迷っていました。配列をソートして中央値を見つける必要があるため、ゼロが問題です。

割り当ては次のとおりです。

タスクの説明

中央値は、統計の世界で重要な役割を果たします。定義上、これは配列を 2 つの等しい部分に分割する値です。この問題では、いくつかの長整数の現在の中央値を決定します。

5 つの数字 {1,3,6,2,7} があるとします。この場合、3 は両側にちょうど 2 つの数値があるため、中央値です。{1,2} と {6,7}。

{1,3,6,2,7,8} のように値が偶数個ある場合、1 つの値だけではこの配列を 2 つの部分に分割できないため、中央の値 {3,6} の平均を考慮します。したがって、中央値は (3+6)/2 = 4.5 になります。この問題では、小数部分ではなく、整数部分のみを出力する必要があります。その結果、この問題によれば、中央値は 4 になります!

プログラム入力

入力ファイル (c:\codewars\prob06.in) には多数の整数 X (0 <= X < 2^31 ) が含まれており、整数の総数 N は 10000 未満です。整数のリストの終わりを示します。「0」を読み取った場合、プログラムは数値 0 で新しい中央値を計算せずに終了する必要があります。

1 3 4 60 70 50 2 0 

プログラム出力

各数値が読み取られるたびに、中央値を再計算して画面に表示します。

1 2 3 3 4 27 4 

これまでの私の試みは次のとおりです。

import java.util.*;
import java.io.*;

public class Median {
    public static void main (String args[]) {
        
        String fileName = "textfile.txt";
        
        //Labels scanner
        Scanner inputStream = null;
        int fileLen=0;
        int[] m = new int[1000];


        try{
            inputStream = new Scanner (new File (fileName));
            LineNumberReader lnr = new LineNumberReader(new FileReader(new File(fileName)));
            lnr.skip(Long.MAX_VALUE);
            fileLen = lnr.getLineNumber();
        }
        catch(Exception e) {
            System.out.println("Could not open the file named: " + fileName);
            System.exit(0);
        }
        
        int middle = 0;

        for (int counter=0;counter<fileLen && inputStream.hasNextInt();counter++){
            
            int unChecked = inputStream.nextInt();
            if (unChecked != 0) {
                m[counter]=unChecked;
                removeZeros(m);
                median(m, fileLen);
                //Arrays.sort(m);
            }else if (unChecked == 0){
                counter+=fileLen;
            }
        }
        }
    
        
            
        
        
    
    
    
    
    public static int median(int m[],int fileLen) {
        int[] b = new int[fileLen];
        System.arraycopy(m, 0, b, 0, b.length);
        Arrays.sort(b);
        System.out.println(b[1]);
        if (m.length % 2 == 0) {
        System.out.println((b[(b.length / 2) - 1] + b[b.length / 2]) / 2);
        return (b[(b.length / 2) - 1] + b[b.length / 2]) / 2;
        } else {
        System.out.println(b[b.length / 2]);
        return b[b.length / 2];
        }
    }
    
    static void removeZeros(int m[]) {
        
        int counter2=0,counter4=0;
        for(int counter=0;counter<m.length;counter++){
            if (m[counter]!=0){
                counter2++;
                System.out.println(m[counter]);
            }
        }
        
        int d[] = new int [counter2];
        for(int counter=0;counter<m.length;counter++){
            if (m[counter]==0){
                d[counter4] = m[counter];
                counter4++;
            }
        }
            
}
}
4

1 に答える 1

0

getLineNumberプログラムでは、おそらく常に 1 を返します (または何らかの値 != 現在の位置)。これにより、不正な動作がmedian発生し、プログラムが早期に終了します。lnrそのため、 andを取り除き、代わりに中央値関数にfileLen渡します。counter+1

いくつかのヒント:

  • break;の後に置くだけif (unChecked == 0)です。

  • の場合if (unChecked != 0) ... else if (unChecked == 0)、 を削除できますif (unChecked == 0)

  • 削除removeZerosしてください。機能は問題の要件に適合しません。

  • すべての入力番号でセット全体をソートするのは悪い考えです。挿入ソートを調べて、ソートしてください。

于 2012-12-22T12:31:57.283 に答える