2014-04-06 98 views
0

我真的被这个问题困住了,不知道该怎么做。从java中的文本文件中读取整数,然后找到中位数

我想要做的是从文本文件中读取一组数字作为输入。

例如。

4 
1 
2 
3 
4 

第一行包含N,数字的计数。 N行跟随。

如果N是偶数,则 - >N/2。在这种情况下,4/2 = 2。从中我们发现列表中第二小的数字。这是输出。

如果N为奇数,则 - >N+1/2,并且执行相同操作。

我该怎么做?我有这个到目前为止,但我不知道如何排序它并将其读入一个数组。

我已经绊倒了我的路。我真的只是在黑暗中拍摄。

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

class TestClass { 

    public static void main(String args[]) throws Exception { 

     // read number of data from system standard input. 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     String line = br.readLine(); 
     int N = Integer.parseInt(line); 
     // median sum 
     long SumMedians = 0; 

     { 
      int[] MyArray = new int[N]; 
      for (int i = 0; i < N; i++) { 
       MyArray[i] = Integer.parseInt(br.readLine()); 
      } 
     } 

     // write output to system standard output 
     System.out.println(SumMedians % 100000); 
     System.out.println(MyArray); 

    } 
} 

回答

0

你可以对列表进行排序,然后找媒体

Arrays.sort(MyArray); // use java collection sort 
SumMedians = (N % 2 == 0) ? MyArray[N/2] : MyArray[(N+1)/2]; 
0

如果您的号码是在一个文件你为什么从System.in读?

检查this tutorial关于如何逐行打开和读取文件。

将数据读入字符串,然后使用Integer.parseInt()方法将它们解析为整数,并在解析它们时将它们存储在数组中。

如果你的整数之间用空格分隔做String.split(),然后做一个Integer.parseInt()

一旦你在整数数组中的数据,通过使用Arrays.sort()

0

数组进行排序,我认为你需要的是这样的:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.util.Arrays; 

public class Main { 

    public static void main(String args[]) throws Exception { 

     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     int N = Integer.parseInt(br.readLine()); 

     int[] numbers = new int[N]; 
     for (int i = 0; i < N; i++) { 
      numbers[i] = Integer.parseInt(br.readLine()); 
     } 

     long sumOfTheMedians = 0; 
     for (int n = 0; n < N; n++) { 
      int[] slicedArray = Arrays.copyOfRange(numbers, 0, n + 1); 
      Arrays.sort(slicedArray); 
      sumOfTheMedians += medianForArray(slicedArray); 
     } 

     System.out.println(sumOfTheMedians % 100000); 

    } 

    private static int medianForArray(int[] numbers) { 
     int n = numbers.length - 1; //we have table from 0 to N - 1, not from 1 to N 
     return (n % 2 == 0) ? numbers[(n+1)/2] : numbers[n/2] ; 
    } 
} 

我推断从你的详细描述和代码这个解决方案,也是我发现这个http://bit.ly/1hQhng9。我知道,它可以写得更好,但这只是一个草稿。

+0

这是v。有帮助!谢谢。 – user2974706

+0

是的,它的一个hackerearth问题:)试图找出如何使现在更快 – user2974706

0

假设输入文件的第一行是后面的元素(n)的数量,并且接下来的n个数字是要推断中值的集合的数字,可以写下如下内容:

import java.io.IOException; 
import java.nio.file.Paths; 
import java.util.Arrays; 
import java.util.Scanner; 

public class Median 
{ 
    public Median() 
    { 
    try (Scanner scanner = new Scanner(Paths.get("/Users/Path/To/Input.txt"))) 
    { 
     int numberOfElements = scanner.nextInt(); 

     int[] numbers = new int[numberOfElements]; 

     for (int i = 0; i < numberOfElements; ++i) 
     { 
     numbers[i] = scanner.nextInt(); 
     } 

     Arrays.sort(numbers); 

     int medianIndex = ((numberOfElements % 2 == 0 ? 
     numberOfElements : numberOfElements + 1) >> 1) - 1; 

     System.out.println(numbers[medianIndex]); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    } 

    public static void main(String[] args) 
    { 
    new Median(); 
    } 
}