@lover_loser

Добавление строки к строке до определённого (бесконечно большого) числа и нахождение в ней символа 'а'. Как решить?

пример
дана строка "aba" и число 10
мы прибавляем к строке 7 символов из строки "aba" по очереди в итоге строка должна быть "abaabaabaa"
Подсчитываем количество символов 'a'
метод должен вернуть 7
//что у меня получилось не проходит все тесты
пример не пройдённого теста
строка "udjlitpopjhipmwgvggazhuzvcmzhulowmveqyktlakdufzcefrxufssqdslyfuiahtzjjdeaxqeiarcjpponoclynbtraaawrps"
число 872514961806
необходимый результат 69801196944
\\ пример моего кода
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {

    // Complete the repeatedString function below.
    static long repeatedString(String s, long n) {
        if (n > Integer.MAX_VALUE){

            return n;
        }
        long count = n - s.length();
        long repeatedLetter = 0;

        StringBuilder sBuilder = new StringBuilder(s);
        for (int i = 0; i < count; i++) {
            sBuilder.append(sBuilder.charAt(i));
        }
        s = sBuilder.toString();

        char[] sArray = s.toCharArray();
        for (char c : sArray) {
            if (c == 'a') {
                repeatedLetter++;
            }
        }
    return repeatedLetter;
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        String s = scanner.nextLine();

        long n = scanner.nextLong();
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        long result = repeatedString(s, n);

        bufferedWriter.write(String.valueOf(result));
        bufferedWriter.newLine();

        bufferedWriter.close();

        scanner.close();
    }
}
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
Erik_Mironov
@Erik_Mironov
Старые вопросы: *Dies from cringe*
Вам не нужно конкатенировать миллиарды символов, вы можете посчитать количество повторов в исходной строке, а затем умножить это число на количество полных повторов строки + остаток
static long repeatedString(String s, long n) {
        /* Кол-во повторов в исходной строке */
        int rep = (int) s.toLowerCase()
                .chars()
                .filter(c -> c == 'a').count();

        /* Кол-во циклов, в которых исходная строка будет полностью скопирована */
        long cycles = (n / s.length()) - 1;

        /* Кол-во повторов в остаточной строке, которой не хватило на полный цикл */
        int remainder = (int) s.toLowerCase()
                .substring(0, (int) n % s.length())
                .chars()
                .filter(c -> c == 'a').count();

        return rep * cycles + remainder + rep;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Cdracm
я отвечу на этот вопрос вопросом. сколько потребуется памяти, чтобы повторить строку "udjlitpopjhipmwgvggazhuzvcmzhulowmveqyktlakdufzcefrxufssqdslyfuiahtzjjdeaxqeiarcjpponoclynbtraaawrps" 872514961806 раз?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы