【问题标题】:How to efficiently return the max possible integer with a given number of digits如何有效地返回给定位数的最大可能整数
【发布时间】:2018-09-06 12:25:03
【问题描述】:

例如,如果给定一个等于 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

【问题讨论】:

  • 如果有帮助,它是 N 的 10,负 1。
  • 如果您正在寻找最快的方法,您可以预先计算一个数组{0, 9, 99, 999, ..., 99999999 },然后按索引取值
  • 啊...我的大脑早上不是最好的...谢谢@khelwood
  • @DmitryBychenko 我想你会使用与khelwood相同的想法来填写数组?
  • @LogicNewbie:我建议硬编码 private static int[] data = {0, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999};

标签: java algorithm performance


【解决方案1】:

您只有 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 的大小是固定的。但请注意,此方法不会扩展到 BigIntegers。

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

    【讨论】:

      【解决方案3】:
      public static int largestPossibleNumber(int n) {
          return (int) (Math.pow(10.0, n)) -1;
      }
      

      【讨论】:

      • 浮点取幂效率不高,对于10的输入值,这会产生错误的结果。
      【解决方案4】:
      public static int largestPossibleNumber(int numDigits) {
        return (int) (Math.pow(10, numDigits)) - 1;
      }
      

      【讨论】:

      • 如果位数有点大,这很容易失败,不应该有一些保护代码或至少一个javadoc定义numbDigits的适用范围吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多