Java 如何高效地返回给定位数的最大可能整数

Java 如何高效地返回给定位数的最大可能整数,java,algorithm,performance,Java,Algorithm,Performance,例如,如果给定一个等于3的n,那么获得say999的最有效方法是什么 这就是我现在得到的,但我想知道是否有更优雅的方式 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.ou

例如,如果给定一个等于3的
n
,那么获得say
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个有效答案,因此您可以硬编码:


你要求的是最有效的方法。很难证明某种方法是最有效的——至少需要实现和基准测试多种方法

但这里有一个非常快速的方法可以做到这一点-只需创建一个
映射
,或者使用
开关
,见下文。 这是因为
int
的大小是固定的。但是请注意,该方法不会扩展到,比如说,
biginger
s

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();
    }
}

如果有帮助的话,它是N的10减去1。如果你正在寻找最快的方法,你可以预先计算一个数组
{0,9,99,999,…,99999999}
然后通过索引获取值。。。早上我的大脑不是最好的。。。thx@khelwood@DmitryBychenko我假设您使用与khelwood相同的想法来填充数组?@LogicNewbie:我建议硬编码
private static int[]data={0,9,99,999,9999999999999999999}浮点求幂运算效率不高,这将为
10
的输入值产生错误的结果。如果位数稍大,这很容易失败,是否应该有一些保护代码或至少一个定义
numbits
适用范围的javadoc?
public static int largestPossibleNumber(int numDigits) {
  return (int) (Math.pow(10, numDigits)) - 1;
}
  private static int[] s_Numbers = {
    0, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999};

  private static int largestPossibleNumber(int n) {
    return s_Numbers[n];
  }
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();
    }
}