1

我有以下锻炼:

开发回合制策略 Losers-V 的 Lavin Interactive Company 通过将游戏本地化为尽可能多的语言,不断扩展其目标市场。特别是,他们有兴趣在 Anindilyakwa 中创建游戏版本,这是澳大利亚土著人使用的语言之一。然而,由于 Anindilyakwa 没有数字,本地化变得复杂。“你有七条黑龙,你的敌人有四十条黑龙”这样的短语如何翻译成这种语言?本地化人员决定将其翻译如下:“你的黑龙很少,你的敌人有很多黑龙。” 他们编制了一张表格,显示了用 Anindilyakwa 单词替换怪物数量的规则。

我的实现如下:

import java.util.Scanner;

public class Localization {

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        int number;
        String designation;

        number = s.nextInt();

        if (number >= 1 && number <= 4) {
        designation = "few";
        }else if(number >= 5 && number <= 9){
            designation = "several";
        }else if(number >= 10 && number <= 19){
            designation = "pack";
        }else if(number >= 20 && number <= 49) {
            designation = "lots";
        }else if(number >= 50 && number <= 99){
            designation = "horde";
        }else if(number >= 100 && number <= 249){
            designation = "throng";
        }else if(number >= 250 && number <= 499){
            designation = "swarm";
        }else if(number >= 500 && number <= 999){
            designation = "zounds";
        }else{
            designation = "legion";
        }
        System.out.println(designation);

    }
}

我在比赛服务器上加载了我的代码。我看到了下一个统计数据:

执行时间:0.109

使用的内存:1 434 KB

在此之后,我检查了顶级结果和我所看到的:

排名 1:

执行时间:0.062

使用的内存:78 KB

结论:

我的代码慢了两倍;我的代码使用了 20 倍的内存。

我的问题:如何?如何?这怎么可能?为什么我的代码如此愚蠢?我需要更改什么来改进我的代码?

4

6 回答 6

2

您可以像这样在if-else语句中取消检查。代替:

if (number >= 1 && number <= 4) {
    designation = "few";
}else if(number >= 5 && number <= 9){
    // ....

您只能检查上限:

if (number >= 1 && number < 5) {
    designation = "few";
}else if(number < 10){
    // ...
于 2012-11-17T22:30:50.047 回答
1

不确定内存问题。时间和内存可能由库代码(println、scanner)支配。例如,我认为 println 会刷新流,这很昂贵。

为了减少比较的平均和最大数量,您可以尝试利用数字的分布方式。在不知道这一点的情况下,您可以使用二进制搜索(这里在桶上完成,您也可以在会产生不同树的数字空间上完成):

if (number < 50) {
  if (number < 10) {
    if (number < 5) {
      designation = "few";
    } else {
      designation = "several";
    }
  } else {
    if(number < 20) {
      designation = "pack";
    } else {
      designation = "lots";
  }
} else {
  if (number < 250) {
    if (number < 100) {
      designation = "horde";
    } else {
      designation = "throng";
    }
  } else {
    if (number number < 500) {
      designation = "swarm";
    } else if (number number < 1000) {
      designation = "zounds";
    } else{
      designation = "legion";
    }
  }
} 

此代码需要 4 次比较才能达到 1000 而不是 8。

于 2012-11-17T22:46:19.087 回答
1

您可以通过避免使用扫描仪来减少内存。只需通过 InputStreamReader 读取一行并使用 Integer 类对其进行解析。

于 2012-11-17T22:32:05.707 回答
0

如果您想提高执行时间,您应该在条件内执行 System.out.println,然后返回。此外,您不需要创建名称 var。

}else if(number >= 5 && number <= 9){
        System.out.println("several");
        return;
于 2012-11-17T22:41:24.087 回答
0

假设您正在使用另一个答案中的 BufferedStream 输入思想,而不是使用 try-catch 块将输入安全地转换为整数,您可以从 main 方法抛出异常。这可以防止您加载任何专门的异常。

我想出了 0.078 秒和 366 kb 的内存。我看到的最好的是 0.062,内存为 18kb。那简直是疯了。

于 2012-11-17T22:33:33.717 回答
0

我用这段代码把它缩小到 370 KB,0.78 秒。有点无聊,想更进一步……

import java.io.IOException;

public class Localization {
    public static void main (String[] args) {
        short s = 0;
        while (true) {
            int next = 0;
            try {
                next = System.in.read();
            } catch (IOException e) {

            }
            if (next < '0' || next > '9') break;

            s = (short) (s * 10);
            s = (short) (s + ((short) (next - '0')));
        }

        if (s >= 100) {
            if (s >= 500) {
                if (s >= 1000) {
                    System.out.print('l');
                    System.out.print('e');
                    System.out.print('g');
                    System.out.print('i');
                    System.out.print('o');
                    System.out.print('n');
                } else {
                    System.out.print('z');
                    System.out.print('o');
                    System.out.print('u');
                    System.out.print('n');
                    System.out.print('d');
                    System.out.print('s');
                }
            } else {
                if (s >= 250) {
                    System.out.print('s');
                    System.out.print('w');
                    System.out.print('a');
                    System.out.print('r');
                    System.out.print('m');
                } else {
                    System.out.print('t');
                    System.out.print('h');
                    System.out.print('r');
                    System.out.print('o');
                    System.out.print('n');
                    System.out.print('g');
                }
            }
        } else {
            if (s >= 10) {
                if (s >= 50) {
                    System.out.print('h');
                    System.out.print('o');
                    System.out.print('r');
                    System.out.print('d');
                    System.out.print('e');
                } else if (s >= 20) {
                    System.out.print('l');
                    System.out.print('o');
                    System.out.print('t');
                    System.out.print('s');
                } else {
                    System.out.print('p');
                    System.out.print('a');
                    System.out.print('c');
                    System.out.print('k');
                }
            } else {
                if (s >= 5) {
                    System.out.print('s');
                    System.out.print('e');
                    System.out.print('v');
                    System.out.print('e');
                    System.out.print('r');
                    System.out.print('a');
                    System.out.print('l');
                } else {
                    System.out.print('f');
                    System.out.print('e');
                    System.out.print('w');
                }
            }
        }

        System.out.println();
        System.out.flush();
    }
}
于 2012-11-17T23:36:39.597 回答