【问题标题】:Algo gets the timeout for the Integer.MAX_VALUE算法获取 Integer.MAX_VALUE 的超时
【发布时间】:2019-09-16 12:42:15
【问题描述】:

我有一个算法,它提供从 1 到 N 的整数因子。代码如下提供,

public static int solution(int N) {

        int count = 0;

        for (int i = 1; (i * i) <= N; i++) {

            if (i * i == N) {
                count++;

                return count;
            }

            if (N % i == 0) {
                count += 2;
            }
        }

        return count;
    }

这很好用,但是对于非常大的整数值显然会中断,例如Integer.MAX_VALUE。如何改进非常大的值的代码?

【问题讨论】:

  • 你可以使用 BigInteger 代替 int
  • 这段代码是找到N的除数还是它的因子?不管怎样count都不对
  • 你可以用longs,还不够,那就是:BigInteger
  • @ernest_k 计数哪里出错了?你的意思是负值?
  • @JudeNiroshan 任何最佳解决方案都将包括更多数学运算,可能是N 的素因数分解,您可以从中直接计算除数。

标签: java algorithm performance


【解决方案1】:

只需如下更改您的 for 循环条件,它应该可以工作。

 for (int i = 1; (i * i) > 0 && (i * i) <= N; i++) {

由于46341 发生溢出,因此需要进行此更改,并且该数字的任何平方都会导致负值(很可能,因为溢出是未定义的行为)并导致满足 (i * i) &lt;= N 的条件和循环进一步继续。因此,只需添加一个额外的检查,即正方形应该 > 0 来处理这种情况。

【讨论】:

  • 这非常有帮助,因为我不知道负值。我们也可以将容器转换为long,我得到100%的正确性。
【解决方案2】:

如果N == Integer.MAX_VALUE(i * i) &lt;= N 将始终为true,因为int 乘法的结果不能高于Integer.MAX_VALUE。因此循环永远不会终止。

您可以将i 更改为long,这将支持更大的N 值。

【讨论】:

  • 不正确。请看一下代码,if (i * i == N) { count++; return count; }
  • @Arefe 这对你没有帮助,因为 Integer.MAX_VALUE 的平方根不是整数(它是 46340.95...),所以 if (i * i == N) 条件永远不会成立。跨度>
  • 另外,我认为问题是如果你从int 的平方根增加值,平方变为负数,从而使其成为无限循环。
【解决方案3】:

您可以将算法更改为除以i 而不是乘以i,这样最高的数字将始终是输入。这将允许Integer.MAX_VALUE 在不更改数据类型的情况下运行:

public static int solution(int N) {
    int count = 0;
    for (int i = 1; (N / i) >= i; i++) {
        if (N / i == i) {
            count++;
            return count;
        }
        if (N % i == 0) {
            count += 2;
        }
    }
    return count;
}

注意for 条件和第一个if 条件现在是(N / i) &gt;= iN / i == i,它们将具有与以前相同的功能。

【讨论】:

    【解决方案4】:

    @vivek_23 提供的答案是正确的,但是,我们也可以将条件中的容器转换为long(long) i * i &lt;= N,这样就可以解决问题了,

    public static int solution(int N) {
    
            int result = 0;
    
    
            // int i = 46341;
            for (int i = 1; (long) i * i <= N; i++) {
    
                /*
                 * we only have one factor
                 * */
                if (i * i == N) {
                    return ++result;
                }
    
                /*
                 * we get 2 factors/ divisors ie i and (N/i)
                 * */
                else if (N % i == 0) {
                    result += 2;
                }
            }
    
            return result;
        }
    

    【讨论】:

      猜你喜欢
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 2015-05-12
      • 2021-09-14
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      相关资源
      最近更新 更多