0

問題を解決しようとしていますが、メモリ制限を取得すると、出力前にバッファリングの原因になると思います。整数を使用しているのですが、最小限のメモリ使用量で出力するにはどうすればよいですか?今私はPrintWriterを使用しています。他にもっと良い方法はありますか?

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; メモリ834KB

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++;
            }
        }

    }
}
4

1 に答える 1

0

バッファは、作成時に固定サイズになります。これは、それをどのように使用するか、またはそれを埋めるかは関係なく、それ以上のメモリを使用しないことを意味します。デフォルトの8KBで、これがメモリ不足の原因になる可能性は低いです。

問題を引き起こすには、これらを何百万も作成する必要がありますが、スタックオブジェクトのVector(コレクションの奇妙な選択)である可能性がはるかに高くなります。

ところで、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を実行するほとんどのシステムにとって最近は何もないと思います。32GBを$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;
        }
    }
}
于 2013-01-04T10:28:56.000 に答える