该函数仅当我将'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,但它不起作用。请问我的代码可能有什么问题?
给出您调用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