【发布时间】:2022-01-22 18:24:24
【问题描述】:
我一直在尝试找到最优化的方法来计算用户为随机个人项目输入的随机数字范围内从 0 到 9 的每个数字的出现次数。 比如说,用户输入 1 作为下限(包括)和 20 作为上限(包括)。输出应该是这样的:
2 12 3 2 2 2 2 2 2 2
用户只能输入正整数。 现在,下面的代码对于小范围的数字/小范围运行良好,但是,正如预期的那样,在我的笔记本电脑上对于大数字/范围需要 4 秒以上。 我一直在努力寻找一种让事情变得更快的方法,我使用模数来获取数字,认为字符串转换可能是罪魁祸首,但它并没有提高速度。我想将运行时间减少到不到 2 秒。一定有办法,但是什么?这是我的原始代码:
import java.util.Scanner;
public class CountDigitsRandomRange {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String g = s.nextLine();
while (!g.equals("0 0")) {
String[] n = g.split(" ");
long x = Long.parseLong(n[0]);
long y = Long.parseLong(n[1]);
long zero = 0;
long one = 0;
long two = 0;
long three = 0;
long four = 0;
long five = 0;
long six = 0;
long seven = 0;
long eight = 0;
long nine = 0;
for (long i = x; i <= y; i++) {
String temp = String.valueOf(i);
for (int j = 0; j < temp.length(); j++) {
if (temp.charAt(j) == '0') {
zero++;
}
if (temp.charAt(j) == '1') {
one++;
}
if (temp.charAt(j) == '2') {
two++;
}
if (temp.charAt(j) == '3') {
three++;
}
if (temp.charAt(j) == '4') {
four++;
}
if (temp.charAt(j) == '5') {
five++;
}
if (temp.charAt(j) == '6') {
six++;
}
if (temp.charAt(j) == '7') {
seven++;
}
if (temp.charAt(j) == '8') {
eight++;
}
if (temp.charAt(j) == '9') {
nine++;
}
}
}
System.out.println(zero + " " + one + " " + two + " "+three + " " + four
+ " " + five + " " + six + " " + seven + " " + eight + " " + nine);
g=s.nextLine();
}
}
}
我在网上看到了一些与我的问题类似的解决方案,但它们大多是 C/C++,我不明白语法。
【问题讨论】:
-
为什么要进行昂贵的字符串拆分操作?您可以遍历整个字符串中的每个字符,并使用 switch-case 来增加计数器匹配的数字。这应该是最快的解决方案。
-
@magicmn 不,这还需要一些时间。也许有更好的方法可以通过动态编程来做到这一点,但不知道如何。
标签: java algorithm optimization