@snack150

Оптимально ли написана программа по слиянию строк и созданию новой строки?

Выполнял я практическое задание с помощью языка Java и у меня возник вопрос: можно ли выполнить моё задание более оптимально или более "правильно"?
Текст задания: напишите функцию, которая принимает две строки и объединяет их, чередуя символы из каждой строки.
Пример: Для строк "abc" и "123" результат будет "a1b2c3".
Дополнительно: Создайте новую строку, в которой будут только символы, находящиеся на четных позициях в объединенной строке. Результат будет "123".
Вот мое решение:
public class StringMerger {

    public static String alternateMerge(String str1, String str2) {
        
        StringBuilder merged = new StringBuilder();
        int maxLength = Math.max(str1.length(), str2.length());

        for (int i = 0; i < maxLength; i++) {
            if (i < str1.length()) {
                merged.append(str1.charAt(i));
            }
            if (i < str2.length()) {
                merged.append(str2.charAt(i));
            }
        }
        return merged.toString();
    }

    public static String getEvenPositionChars(String merged) {
        StringBuilder evenChars = new StringBuilder(); 
        for (int i = 0; i < merged.length(); i++) {
            if (i % 2 != 0) { 
                evenChars.append(merged.charAt(i));
            }
        }
        return evenChars.toString();
    }

    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "123";
        
        String mergedResult = alternateMerge(str1, str2);
        System.out.println("Merged Result: " + mergedResult);
        
        String evenChars = getEvenPositionChars(mergedResult);
        System.out.println("Even Position Characters: " + evenChars);
    }
}

И есть еще один вопрос: дополнительно необходимо реализовать метод для тестирования программы и в нем указать входные данные. Какие тесты можно написать для программы? Мне на ум приходит только: ввод двух строк, которые содержат только пробелы; ввод двух строк, которые содержат цифры и спец. символы.
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Алгоритм, в общем-то оптимален. Но реализация допускает некоторые микро-оптимизации.

Во-первых, StringBuilder можно указать итоговый размер в конструкторе. Тогда там не будет лишних выделений памяти. Вы же знаете, что там будет сумма двух длин в итоге.
Во-вторых, основной цикл лучше гнать не до максимальной длины из двух, а до минимальной. Тогда в цикле не надо никаких проверок, что индекс не вышел за границы строки. После цикла надо будет добавить к собираемой строке кусок одной из двух входных строк. Проверьте, какая строка длиннее и добавьте ровно len1-len2 символов с конца. Используйте метод substring(), чтобы получить этот суффикс и сразу передавайте его в append().

Вторую часть про символы на четных местах тоже можно соптимизировать. Вы знаете длину ответа заранее, инициализируйте StringBuilder с нужной вместимостью.
На четных местах будет вторая строка. Ну и в конце только какие-то символы через один из второй строки или из первой, в зависимости, какая длинее. Если передавать в функцию не результат работы первой, а 2 строки, то можно сначала append в stringbuilder substring от второй строки, а потом циклом взять нужное количество символов через один из первой или второй строки. Нарисуйте на бумаге несколько случаев, первая строка длиннее второй или наоборот. Длина второй строки четная/нечетная, длина первой четная/нечетная. В каждом из этих случаев будет +-1 где-то в формулах для индексации. Можно это все удачно записать с помощью деления на 2 нацело и остатка от деления на 2.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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