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

    }
}
4

1 回答 1

0

创建缓冲区时,缓冲区的大小是固定的。这意味着无论您如何使用它或填充它,它都不会使用更多内存。默认为 8 KB,这不太可能是您内存不足的原因。

它更有可能是堆栈对象的 Vector(集合的一个奇怪选择),尽管您必须创建数百万个这样的对象才能导致问题

顺便说一句,如果没有至少 1.1 MB 的堆(这是该大小程序的一小部分),Java 7 将无法启动。即你甚至不能打印它的版本。

$ 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 的系统来说都不算什么。您可以花 200 美元购买 32 GB,因此 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 回答