2013-01-04 48 views
0

我想解決一個問題,但獲取內存限制 我認爲這是輸出前緩衝的原因 我有整數,我如何以最小的內存使用量輸出它們? 現在我正在使用PrintWriter。還有其他更好的方法嗎?java輸出的最小內存使用情況

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

class stack_ { 
public char index; 
public int value; 

public stack_(char ind, int val) { 
    index = ind; 
    value = val; 
} 
} 

public class timous { 
public static void main(String[] args) throws IOException { 
    StreamTokenizer in = new StreamTokenizer(new BufferedReader (new InputStreamReader(System.in))); 
    Vector<stack_> numbers = new Vector<stack_>(); 
    PrintWriter out = new PrintWriter(System.out); 

    in.nextToken(); 
    char num = (char)in.nval; 
    for (char i = 0, k; i<num; i++) { 
     in.nextToken(); 
     if (in.sval.equals("POP")) { 
      k = (char)(numbers.size()-1); 
      in.nextToken(); 
      while (numbers.elementAt(k).index!=(char) in.nval) 
       k--; 
      out.println(numbers.elementAt(k).value); 
      numbers.removeElementAt(k); 
     }    
     else { 
      in.nextToken(); 
      k = (char)in.nval; 
      in.nextToken(); 
      numbers.add(new stack_(k, (int) in.nval)); 
     } 
    } 
    out.flush(); 
} 
} 

內存限制測試3;時間0.078;內存834 KB

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

public class timous { 
    public static void main(String[] args) throws IOException { 
     StreamTokenizer in = new StreamTokenizer(new BufferedReader (new InputStreamReader(System.in))); 
     int[] numbers_int = new int[20000]; 
     char[] numbers_char = new char[20000]; 
     PrintWriter out = new PrintWriter(System.out,true); 

     in.nextToken(); 
     char num = (char)in.nval; 
     for (char i = 0, k, cur=0; i<num; i++) { 
      in.nextToken(); 
      if (in.sval.charAt(1)=='O') { 
       k = cur; 
       k--; 
       in.nextToken(); 
       while (numbers_char[k]!=(char) in.nval) 
        k--; 
       out.println(numbers_int[k]); 
       for (; k<19999; k++){ 
        numbers_int[k] = numbers_int[k+1]; 
        numbers_char[k] = numbers_char[k+1]; 
       } 
       cur--; 
      }    
      else { 
       in.nextToken(); 
       numbers_char[cur] = (char)in.nval; 
       in.nextToken(); 
       numbers_int[cur] = (int)in.nval; 
       cur++; 
      } 
     } 

    } 
} 
+2

你的問題是什麼?代碼是做什麼的?你能給出更多的上下文嗎?如果你需要低內存佔用,你選擇了錯誤的語言。 – Augusto

+0

[問題1220](http://acm.timus.ru/problem.aspx?space=1&num=1220) – MAB

+1

閱讀標題後,顯然您選擇了錯誤的語言「內存限制:0.75 MB」。您需要在不使用虛擬機運行的情況下構建它。 – Augusto

回答

0

當您創建它時,緩衝區是固定大小。這意味着你如何使用或填充它並不重要,它不會使用更多的內存。默認情況下,如果8 KB,這不可能是你內存不足的原因。

這是更可能是棧對象的載體(集好奇的選擇),但你必須創造數百萬的這些引起問題

BTW Java 7中沒有將無法啓動一個至少1.1 MB的堆(這是這個大小的程序的一小部分)。即你甚至不能打印它的版本。

$ java -mx1000k -version 
Error occurred during initialization of VM 
Too small initial heap for new size specified 

$ java -mx1100k -version 
java version "1.7.0_07" 
Java(TM) SE Runtime Environment (build 1.7.0_07-b11) 
Java HotSpot(TM) Client VM (build 23.3-b01, mixed mode, sharing) 

如果你想知道爲什麼Java的「需要這麼多內存」,我會說這是什麼,這些天的運行Java大多數系統。你可以購買32 GB的200美元,因此1 MB僅價值0.6美分,可重複使用。


鑑於它確實涉及到問題,你可以使用這些方法解析和輸出int值。

static int readInt() throws IOException { 
    int num = 0, ch; 
    while ((ch = System.in.read()) > 0) 
     if (ch > ' ') 
      break; 
    if (ch < 0) 
     return -1; 
    do { 
     num = num * 10 + ch - '0'; 
     ch = System.in.read(); 
    } while (ch > ' '); 
    return num; 
} 

static void writeInt(int i) { 
    if (i == 0) { 
     System.out.write('0'); 
     System.out.write('\n'); 
     return; 
    } else if (i < 0) { 
     System.out.write('-'); 
     writeInt(-i); 
     return; 
    } 
    int tens = 1000000000; 
    for (; tens > i; tens /= 10) ; 
    for (; tens > 0; tens /= 10) 
     System.out.write((char) ('0' + i/tens % 10)); 
    System.out.write('\n'); 
} 

public static void main(String... args) throws IOException { 
    int count = readInt(); 
    for (int i = 0; i < count; i++) { 
     int pushPop = readInt(); 
     switch (pushPop) { 
      case -1: // OEF 
       return; 
      case 36074: // PUSH 
      case 71626: // push 
       push(readInt(), readInt()); 
       break; 

      case 3542: // PUSH 
      case 7094: // pop 
       writeInt(pop(readInt())); 
       break; 
     } 
    } 
} 
+0

我知道有很多java和他的內存使用問題,但這個問題解決了使用java!這意味着它有解決方案! [接受的時間和記憶的例子](http://acm.timus.ru/rating.aspx?space=1&num=1220&lang=java&count=100) – MAB

+0

我不認爲它是一個問題。內存使用是相當可疑的恕我直言,因爲你真的需要欺騙Java說它使用較少的內存,因爲總數永遠不會那麼低。 –

+0

以及爲什麼我認爲這個問題與輸出連接 如果我沒有錯誤out.print調用toString函數爲整數,然後打印它,我相信它爲此它使用內存! – MAB