Он работает, если использовать int, но не работает, когда я использую long. Как заставить эту функцию возвращать долго - PullRequest
0 голосов
/ 26 октября 2019

функция возвращает значение только тогда, когда я объявляю 'n' как int, но возвращает ноль, когда я использую 'long'.

При заданной строке и значении n строка должна объединяться n раз,в объединенной строке мы возьмем первые n символов в этой строке и вернем число появившейся буквы «а».

Выведите одно целое число, обозначающее количество букв а в первых n буквахбесконечная строка, созданная повторением s бесконечное число раз.

В этой функции передаются два параметра: строка и длинное значение. Код работает очень хорошо, если использовать значение типа int вместо long. Пожалуйста, как мне исправить эту длинную и целочисленную проблему?

public class StringLettersRepeat {
    static long repeatedString(String s, long n) {
        String string = "";
        int count =0;

        for(int i=0; i<n; i++){
            string+=s;
        }

        char[] strChar = string.toCharArray();
        char[] result = new char[(int) n];

        for(int i=0; i<strChar.length;i++){
            result[i]=strChar[i];
        }
        for(char str : result){
            if('a'==str){
                count++;
            }
        }

        return count;
    }

    public static void main(String[] args) {
        long result = repeatedString("a", 1000l);
        System.out.println(result);
    }
}

Я ожидаю, что вывод вернет значение, которое является числом count. например, если я введу строку "aba" и n = 7, она должна вернуть 5.

Но если я передам строку, скажем 'a' с n = 100000000000, он должен вернуть 100000000000, но этоне работаетПожалуйста, что не так с моим кодом?

1 Ответ

4 голосов
/ 26 октября 2019

Учитывая ваш пример вызова 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
...