如何高效地返回给定位数的最大整数?

3
例如,如果给定一个等于3的n,那么获取999的最有效方式是什么?
这是我现在拥有的,但我想知道是否有更优雅的方式。
public static int largestPossibleNumber(int numDigits) {
  return Integer.parseInt(new String(new char[numDigits]).replace("\0", "9"));
}

示例用法:

for (int i = 1; i <= 5; i++) {
  System.out.println(largestPossibleNumber(i));
}

输出:

9
99
999
9999
99999

8
如果有帮助的话,它是10的N次方减1。 - khelwood
1
如果您正在寻找最快的方法,可以预先计算一个数组 {0, 9, 99, 999, ..., 99999999 },然后通过索引获取该值。 - Dmitry Bychenko
1
啊...早上我的头脑不太好使...谢谢@khelwood - LogicNewbie
@DmitryBychenko 我猜您填充数组的想法与khelwood的相同? - LogicNewbie
1
@LogicNewbie:我建议将 private static int[] data = {0, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999}; 进行硬编码。 - Dmitry Bychenko
"999999999".substring(0, numberOfDigits)。是的,我知道它返回一个字符串而不是一个 int。如果你需要将其解析为 int,它可能不再是运行时高效的,但仍然很容易阅读,所以是否需要取决于你对“高效”的理解。 - Ole V.V.
4个回答

2

您只有8个有效答案,因此可以进行硬编码:

  private static int[] s_Numbers = {
    0, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999};

  private static int largestPossibleNumber(int n) {
    return s_Numbers[n];
  }

2
您正在寻求最有效的方法。要证明某种方式是最有效的相当困难,至少需要实现和基准测试多种方法。
但这里有一种非常快速的方法来做到这一点-只需创建一个Map或使用switch,如下所示。 这是因为int的大小是固定的。请注意,这种方法不适用于BigInteger等情况。
public static int largestPossibleNumber(final int numDigits) {
    switch (numDigits) {
        case 1: return 9;
        case 2: return 99;
        case 3: return 999;
        case 4: return 9999;
        case 5: return 99999;
        case 6: return 999999;
        case 7: return 9999999;
        case 8: return 99999999;
        case 9: return 999999999;
        case 10: return Integer.MAX_VALUE;
        default: throw new IllegalArgumentException();
    }
}

1
public static int largestPossibleNumber(int n) {
    return (int) (Math.pow(10.0, n)) -1;
}

浮点数的指数运算_不是高效的_,对于输入值为10,这将导致错误的结果。 - Alex Shesterov

0
public static int largestPossibleNumber(int numDigits) {
  return (int) (Math.pow(10, numDigits)) - 1;
}

如果数字位数变得更大,这很容易失败,难道不应该有一些守卫代码或至少是一个Javadoc来定义numbDigits的适用范围吗? - Harald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接