我在下面练习:
Lavin Interactive Company,已经开发了回合制 策略Losers-V,不断扩大其目标市场 将游戏本地化为尽可能多的语言。特别是, 他们有兴趣在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倍的内存。
我的问题:怎么样?怎么样?这怎么可能?为什么我的代码如此愚蠢? 我需要做些什么来改进我的代码?
答案 0 :(得分: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){
// ...
答案 1 :(得分:1)
您可以通过避开扫描仪来减少内存。只需通过InputStreamReader读取一行并使用Integer类解析它。
答案 2 :(得分: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。
答案 3 :(得分:0)
假设您正在使用另一个答案的BufferedStream输入构思,而不是使用try-catch块将输入安全地转换为整数,您可以从main方法中抛出Exception。这可以防止您加载任何专门的异常。
我想出了.078秒,内存为366 kb。我看到的最好的是.062,内存为18kb。那只是疯了。
答案 4 :(得分:0)
如果要改善执行时间,应该在条件内部执行System.out.println,然后返回。您也不需要创建名称var。
}else if(number >= 5 && number <= 9){
System.out.println("several");
return;
答案 5 :(得分: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();
}
}