36. Решение задачи HackerRank “Repeat String” #
Условие задачи:
🔥 Дан строка s
, состоящая из строчных английских букв, которая повторяется бесконечно. Дано целое число n
. Необходимо посчитать количество букв 'a'
в первых n
символах этой бесконечной строки.
Пример:
- s = “abcac”, n = 10
- Подстрока из первых 10 символов: “abcacabcac”.
- Количество букв ‘a’: 4
class Result {
/*
* Complete the 'repeatedString' function below.
*
* The function is expected to return a LONG_INTEGER.
* The function accepts following parameters:
* 1. STRING s
* 2. LONG_INTEGER n
*/
}
Спойлеры к решению
Подсказки
💡 Используй деление: Определи число полных повторений строки, разделив
💡 Подсчитай ‘a’: Сначала посчитай количество
💡 Обработка остатка: Не забудь проверить первые
n
на длину строки s
.💡 Подсчитай ‘a’: Сначала посчитай количество
'a'
в строке s
, а затем умножь на число полных повторений.💡 Обработка остатка: Не забудь проверить первые
n % s.length()
символов для корректного подсчёта.Решение
public class Result {
public static long repeatedString(String s, long n) {
// Подсчёт количества 'a' в строке s
long countA = 0;
for (char c : s.toCharArray()) {
if (c == 'a') {
countA++;
}
}
// Определяем, сколько полных повторов строки укладывается в n символов
long fullRepeats = n / s.length();
long totalA = fullRepeats * countA;
// Обработка остатка: считаем 'a' в первых (n % s.length()) символах
int remainingChars = (int) (n % s.length());
for (int i = 0; i < remainingChars; i++) {
if (s.charAt(i) == 'a') {
totalA++;
}
}
return totalA;
}
public static void main(String[] args) {
String s = "abcac";
long n = 10;
System.out.println("Количество 'a': " + repeatedString(s, n)); // Ожидаемый вывод: 4
}
}
📌 Что улучшилось?
✅ Оптимальность: Вместо создания бесконечной строки алгоритм учитывает полные повторения и остаток, что эффективно при больших n
.
✅ Читаемость кода: Ясное разделение логики на подсчёт a
в полном повторении и обработку остатка.
✅ Стабильность: Решение работает корректно даже для очень больших значений n
.