soln的java.lang.StringIndexOutOfBoundsException

时间:2017-06-03 11:44:42

标签: java

此程序正在抛出java.lang.StringIndexOutOfBoundsException

在一个长字符串中填写数字:" 2357111317192329 ..."

测试用例

Inputs:
    (int) n = 0
Output:
    (string) "23571"

Inputs:
    (int) n = 3
Output:
    (string) "71113"
public class Answer {
        public static String answer(int n) {

        int i = 0;
        int num = 0;
        String primeNumbers = "";
        char[] ar = new char[5];
        for (i = 1; i <= 10000; i++) {
            int counter = 0;
            for (num = i; num >= 1; num--) {
                if (i % num == 0) {
                    counter = counter + 1;
                }
            }
            if (counter == 2) {

                primeNumbers = primeNumbers + i;
            }
        }
        ar[0] = primeNumbers.charAt(n);
        ar[1] = primeNumbers.charAt(n + 1);
        ar[2] = primeNumbers.charAt(n + 2);
        ar[3] = primeNumbers.charAt(n + 3);
        ar[4] = primeNumbers.charAt(n + 4);

        return String.valueOf(ar);

    }
}

2 个答案:

答案 0 :(得分:0)

可能你没有生成足够长度的字符串和给定的字符串长度值。
我建议你检查你的程序在给定N的最大值。
另外我建议你不要使用String(读取每次连接String时创建一个新对象)并简化第二个循环。

public static String answer(int n) {
    StringBuilder sb = new StringBuilder("");
    char[] ar = new char[5];
    for (int i = 2; i <= 10000; i++) {
        boolean flag = true;
        for (int j = 2; j*j <= i; j++) {
            if(i%j==0) {
                flag = false;
                break;
            }
        }
        if(flag) {
            sb.append(i);
        }
    }
    ar[0] = sb.charAt(n);
    ar[1] = sb.charAt(n + 1);
    ar[2] = sb.charAt(n + 2);
    ar[3] = sb.charAt(n + 3);
    ar[4] = sb.charAt(n + 4);

    return String.valueOf(ar);
}

答案 1 :(得分:0)

试试这个解决方案:

    public class Answer {
            public static String answer(int n) {
                StringBuilder primeNumberString = new StringBuilder(0);
                int currentPrimeNumber = 2;

                while (primeNumberString.length() < n+5) {
                    primeNumberString.append(currentPrimeNumber);
                    currentPrimeNumber++;
                    for (int index = 2; index < currentPrimeNumber; index++) {
                        if (currentPrimeNumber % index == 0) {
                            currentPrimeNumber++;
                            index = 2;
                        } else {
                            continue;
                        }
                    }
                }

                return primeNumberString.toString().substring(n, n+5)
        }
    }

=============================================== ======

修改

问题陈述表明,您编写的方法所需的输出应该是长度为5的字符串,它应该来自&#39; n&#39;到&#39; n + 4&#39;。

我们的目标应该是提出一个解决方案,使用尽可能少的资源尽可能快地为我们提供从n到n + 4的字符串。

在您采用的方法中,您将在字符串中添加0到10000之间的所有素数。这大约需要1,229个素数。这种方法的缺陷是,如果输入类似于0.你仍然在构建一串1,229个素数,这是完全没必要的。如果输入类似于100000,则会出现您所面临的错误,因为您没有足够大的字符串。

这里最好的方法是构建一个最大为n + 5的字符串。然后切掉它的子串。它简单而有效。