@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();
    }
}
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 3
Erik_Mironov
@Erik_Mironov
Вам не нужно конкатенировать миллиарды символов, вы можете посчитать количество повторов в исходной строке, а затем умножить это число на количество полных повторов строки + остаток
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;
}
Ответ написан
@Cdracm
я отвечу на этот вопрос вопросом. сколько потребуется памяти, чтобы повторить строку "udjlitpopjhipmwgvggazhuzvcmzhulowmveqyktlakdufzcefrxufssqdslyfuiahtzjjdeaxqeiarcjpponoclynbtraaawrps" 872514961806 раз?
Ответ написан
Bavashi
@Bavashi Куратор тега Java
static long repeatedString(String s, long n) {
       
        long repeatedLetter = 0;
        int stringLength = s.length();
        
        char[] sArray = s.toCharArray();
        for (char c : sArray) {
            if (c == 'a') {
                repeatedLetter++;
            }
        }
        
        if (n <= stringLength){
            return repeatedLetter;
        }
        
        long lettersLeft = n - stringLength;
        double stringsLeft = (double) lettersLeft / stringLength;
        long fullStringsLeft = lettersLeft / stringLength;
        long lettersRemainInLastString = 0;
 
        repeatedLetter = repeatedLetter * (++fullStringsLeft);
        
        if (stringsLeft-fullStringsLeft > 0) {
            lettersRemainInLastString = lettersLeft - (fullStringsLeft*stringLength);
            for (int i=0; i<lettersRemainInLastString; i++){
                if (sArray[i] == 'a') {
                    repeatedLetter++;
                }
            }
        }
        
    return repeatedLetter;
    }
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы