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