【问题标题】:Runtime error - Java [closed]运行时错误 - Java [关闭]
【发布时间】:2014-11-22 03:55:54
【问题描述】:

我试图找到给定一组 N 输入的偶数斐波那契数的总和(从标准输入获得)

此代码在某些测试用例中运行良好,但会为测试用例打印运行时错误(未提供详细信息)。

问题链接:https://www.hackerrank.com/contests/projecteuler/challenges/euler002

代码

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
import java.util.*;
public class Solution {
    public static  Integer[] convert(int[] chars) {
        Integer[] copy = new Integer[chars.length];
        Arrays.fill(copy, 0);
        for(int i = 0; i < copy.length; i++) {
            copy[i] = Integer.valueOf(chars[i]);
        }
        return copy;
    }

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
                int x, max;
        int a[], sum[], fib[]; 
        Scanner in = new Scanner(System.in); 
       x = in.nextInt();
        a = new int[x];
        sum = new int[x];
        for(int i=0;i<x;i++)
            {
                a[i] = in.nextInt();
            }
        Integer[] b = convert(a);
        max = Collections.max(Arrays.asList(b));
        fib = new int[max];
        if (max >1)
            {
        fib[0]=1;
        fib[1]=1;            
        }
        for(int i=2;i<max;i++)
            {
            fib[i] = fib[i-1]+fib[i-2];
        }
        for(int i =0;i<x;i++)
            {
            for(int j = 0;fib[j]<a[i];j++)
                {
                if(fib[j]%2 ==0)
                    sum[i] = sum[i] + fib[j];
            }
        }
        for(int i=0;i<x;i++)
            {
            System.out.println(sum[i]);
        }
    }
}

感谢任何帮助。

如果您能帮助我提供相同的优化版本,我将不胜感激。

【问题讨论】:

  • 您能指出您的代码中哪里有问题吗?
  • 指出确切的运行时错误也是有益的。
  • 斐波那契是世界上最糟糕的问题,所以有些情况甚至超级计算机也需要 100 年才能得到答案
  • 幸运的是他的最大值被定义为一个整数,所以不用担心计算时间。
  • 解释这样做的目的:for (int i = 0; i &lt; x; i++) { a[i] = in.nextInt(); } 为什么要用用户输入的值填充数组?而且,更糟糕的是,你为什么不提示用户?用户是否应该猜测所需的输入时间和类型?

标签: java runtime-error fibonacci


【解决方案1】:

在某些情况下,您的代码会抛出 ArrayIndexOutOfBoundsEception。

让我们考虑一下你在做什么:

  • 您正在从用户那里获得x 的输入
  • 然后创建数组ax 元素,由用户输入
  • 然后找到amax 元素
  • 您创建一个包含max 元素的数组fib,并为从0max-1 的每个i 计算fib[i]

假设用户输入:2 2 2

max 为 2,因此 fib 将包含两个元素:{1,1}

现在,以下循环将导致异常:

    for(int i =0;i<x;i++) // x is 3
    {
        for(int j = 0;fib[j]<a[i];j++) // both fib[0] and fib[1] < a[0]
                                       // fib[2] would throw the exception

不清楚你想用这个嵌套循环做什么,但显然它不起作用。

【讨论】:

  • x 是输入的数量。所以在循环中'x'的值是2而不是3。但是我已经发布了我的问题的链接。请考虑调查一下。如果我的问题不清楚。
  • @user3391849 我的意思是在示例中 2 2 2 是实际数组(假设 x 为 3)
【解决方案2】:

我认为问题在于java中的递归调用堆栈太深了,所以java编译器会打印RE。为了优化这个问题,首先,你可以使用dp方法来解决这个问题。dp方法是减少对问题的重复次数。 链接是http://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92 希望能帮到你。

【讨论】:

  • 您认为或确定?答案不应该是猜测。