2011-02-10 107 views
3

我正在解決這個question哪一種在Java中輸入最有效的方法?

這是我的代碼:

import java.io.IOException; 
import java.util.Scanner; 


public class Main { 
    public static void main(String[] args) throws IOException { 
     Scanner sc = new Scanner(System.in); 
     int n = sc.nextInt(); 
     int k = sc.nextInt(); 
     int[] t = new int[n]; 
     int count = 0; 
     for (int i = 0; i < n; i++) { 
      t[i] = sc.nextInt(); 
      if (t[i] % k == 0) { 
       count++; 
      } 
     } 
     System.out.println(count); 

    } 
} 

但是,當我提出它,得到它的超時。請儘可能地幫助我優化它。

輸入:

7 3 
1 
51 
966369 
7 
9 
999996 
11 

輸出:

4 

他們說:

我們希望你能夠處理 至少2.5MB輸入數據爲每個運行時爲秒。

修改後的代碼

謝謝大家......我修改我的代碼和它的工作...這裏是....

public static void main(String[] args) throws IOException { 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     String[] input = br.readLine().split(" "); 
     int n = Integer.parseInt(input[0]); 
     int k = Integer.parseInt(input[1]); 
     int count = 0; 
     for (int i = 0; i < n; i++) { 
      if (Integer.parseInt(br.readLine()) % k == 0) { 
       count++; 
      } 
     } 
     System.out.println(count); 
    } 

問候

shahensha

+1

爲什麼使用`int [] t`如果你沒有在這裏使用這個數組做任何有用的事情?你可以用`int t`代替。 – limc 2011-02-10 17:51:17

+0

這看起來像ACM-ICPC問題的輸入代碼,這是整個「程序」嗎?它從哪裏超時?在線評委?你能給我們一些樣本輸入嗎? – Argote 2011-02-10 17:53:42

+0

是的,這是整個程序......並且他們在服務器上運行代碼......他們給了我們8秒鐘的這個特定程序......他們說「你應該能夠處理至少2.5MB在運行時每秒輸入數據。「 – shahensha 2011-02-10 17:58:24

回答

1

這可能會稍微快一些,基於limc的解決方案,BufferedReader應該會更快。

import java.io.IOException; 
import java.util.Scanner; 

public class Main { 
    public static void main(String[] args) throws IOException { 
     Scanner sc = new Scanner(System.in); 
     int n = sc.nextInt(); 
     int k = sc.nextInt(); 
     int count = 0; 
     while (true) { 
      try { 
       if (sc.nextInt() % k == 0) { 
        count++; 
       } 
      } catch (NoSuchElementException e) { 
       break; 
      } 
     } 
     System.out.println(count); 

    } 
} 
0

BufferedReader應該是比Scanner更快。你將需要自己解析所有的東西,根據你的實現它可能會更糟糕。

1

這個怎麼樣?

Scanner sc = new Scanner(System.in); 
int n = sc.nextInt(); 
int k = sc.nextInt(); 
int count = 0; 
for (int i = 0; i < n; i++) { 
    if (sc.nextInt() % k == 0) { 
     count++; 
    } 
} 
System.out.println(count); 
1

您可能會考慮閱讀大塊的輸入,然後從那裏獲取數字。

其他變化是,您可以使用Integer.parseInt()而不是Scanner.nextInt(),雖然我不知道每個的細節,有些人告訴我掃描儀版本執行多一點計算,以確定輸入是否正確。另一種方法是自己轉換數字(雖然Integer.parseInt應該足夠快)

創建一個示例輸入,然後測量您的代碼,稍微改變一下,看看有什麼不同。

測量,測量!

相關問題