如果使用'int',它将起作用,但是当我使用'long'时,它将失败。我如何使此函数返回长

时间:2019-10-25 23:14:39

标签: java string long-integer

该函数仅在我将'n'声明为int时返回值,而在我使用'long'时返回null。

给出一个字符串和一个值n,该字符串应被连接n次。在连接的字符串中,我们将采用该字符串的前n个字符,并返回出现的字母“ a”的数量。

打印一个整数,该整数表示通过无限次重复s而创建的无限字符串的前n个字母中的字母a的数量。

在此函数中,传递了两个参数,一个字符串和一个长值。如果使用int值而不是long,则代码可以很好地工作。请问我该如何解决这个long和int问题?

public class StringLettersRepeat {
    static long repeatedString(String s, long n) {
        String string = "";
        int count =0;

        for(int i=0; i<n; i++){
            string+=s;
        }

        char[] strChar = string.toCharArray();
        char[] result = new char[(int) n];

        for(int i=0; i<strChar.length;i++){
            result[i]=strChar[i];
        }
        for(char str : result){
            if('a'==str){
                count++;
            }
        }

        return count;
    }

    public static void main(String[] args) {
        long result = repeatedString("a", 1000l);
        System.out.println(result);
    }
}

我希望输出返回一个值,即计数数。 例如,如果我输入字符串“ aba”且n = 7,则应返回5。

但是如果我传入一个字符串,说n为100000000000的'a',它应该返回100000000000,但它不起作用。请问我的代码可能有什么问题?

1 个答案:

答案 0 :(得分:4)

以您调用repeatedString("aba", 7)的示例为例,结果字符串将为"abaabaa",并且正如您所说的那样有5个a。

但是,您实际上不必构建该结果字符串。相反,要意识到结果字符串是重复2次的原始字符串,加上该字符串的前1个字符,可以使用除法和余数数学很容易地计算出这两个值:

long repeats = n / s.length();
long extra = n % s.length();

现在,如果您计算字符串中a的个数,则可以乘以repeats。您无需重复计数操作。如果然后再计算字符串的前extra个字符中a的个数,则得出最终结果。

int countFull = 0, countExtra = 0;
for (int i = 0; i < s.length(); i++) {
    if (s.charAt(i) == 'a') {
        countFull++;
        if (i < extra)
            countExtra++;
    }
}

然后计算总数并返回:

return countFull * repeats + countExtra;

此代码的运行速度也要快得多,因为您只需迭代一次s,而对于n的性能而言则无关紧要,并且您无需复制任何字符,因此也使用更少的内存。它实际上不使用任何内存。

Big-O是:
性能: O(m)其中m是输入字符串的长度。
内存: O(1)
两者均与n无关。

测试

System.out.println(repeatedString("aba", 7));
System.out.println(repeatedString("a", 100000000000L));

输出

5
100000000000