Учитывая ваш пример вызова repeatedString("aba", 7)
, результирующая строка будет "abaabaa"
, и, как вы сказали, будет иметь 5 а
Но на самом деле вам не нужно создавать эту строку результата. Вместо этого следует понимать, что результирующей строкой является исходная строка, повторенная 2
раз, плюс первые 1
символов строки, оба из которых можно легко вычислить с помощью математического деления и остатка:
long repeats = n / s.length();
long extra = n % s.length();
Теперь, если вы посчитаете количество символов в строке, вы можете умножить на repeats
. Вам не нужно повторять операцию подсчета. Если затем вы также посчитаете число «а» в первых extra
символах строки, у вас будет конечный результат.
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
- длина входной строки.
Память: O (1)
Не относится к n
.
Тест
System.out.println(repeatedString("aba", 7));
System.out.println(repeatedString("a", 100000000000L));
Выход
5
100000000000