[如果使用'int'可以使用,但是当我使用'long'时可以使用。如何使此函数返回长值

问题描述 投票:-1回答:1

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

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

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

在此函数中,传递了两个参数,一个字符串和一个长值。如果使用int值而不是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,但它不起作用。请问我的代码可能有什么问题?

java string long-integer
1个回答
3
投票

给出您调用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无关。

Test

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

输出

5
100000000000
© www.soinside.com 2019 - 2024. All rights reserved.