3 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
我建議找出基本字符串重復(fù)的次數(shù),并使用此信息計(jì)算字母的出現(xiàn)次數(shù),以及最后出現(xiàn)的額外子字符串的次數(shù)。例如:
String s = "monday";
int n = 10;
String chr = "a";
int baseNum = s.length() - s.replace(chr, "").length();
int baseCnt = (n / s.length()) * baseNum;
int index = n % s.length();
String left = s.substring(0, index);
int finalCnt = left.length() - left.replace(chr, "").length();
int totalCnt = baseCnt + finalCnt;
System.out.println("There were " + totalCnt + " letter " + chr + ".");
這里的基本思想是效率。我們實(shí)際上不需要?jiǎng)?chuàng)建和使用任意長度的字符串,因?yàn)槲覀冎浪皇侵貜?fù)相同的子字符串。相反,我們可以只計(jì)算子字符串中的出現(xiàn)次數(shù),并通過該子字符串重復(fù)的次數(shù)來預(yù)測(cè)總數(shù)。

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
正如其他答案中已經(jīng)指出的那樣,您不需要構(gòu)建最終字符串。
這是我的解決方案:
public static void main(String[] args){
String s = "abcacas";
long n = 1000000;
long count = getCount(s, n, 'a');
System.out.println(count);
}
private long getCount(String str, long n, char c) {
int length = str.length();
long repeats = n / length;
long reminder = n % length;
long count = 0;
for (int i = 0; i < length; i++) {
if (str.charAt(i) == c) {
count += repeats;
if (i < reminder) {
count++;
}
}
}
return count;
}

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
您不需要構(gòu)建最終字符串。您只需要計(jì)算s字符串中 'a'(或任何您想要的)的出現(xiàn)次數(shù),并計(jì)算它s重復(fù)了多少次。畢竟,計(jì)算提醒中“a”的出現(xiàn)次數(shù)。
long countInS = // count all occurances of 'a'
long repeats = n / s.length;
long reminder = n % s.length;
String sReminder = s.substring(reminder);
long countInReminder = // count all occurances of 'a' in sReminder
long count = repeats * countInS + countInReminder;
無需浪費(fèi)您的 RAM
添加回答
舉報(bào)