← Назад к вопросам

Удаление пробелов из строки без replace()

1.3 Junior🔥 111 комментариев
#Soft Skills и карьера

Условие

Напишите Java-программу для удаления всех пробелов из строки без использования методов replace(), replaceAll() или других встроенных методов замены.

Пример

Входные данные: "Hello World Java"

Выходные данные: "HelloWorldJava"

Требования

  • Нельзя использовать String.replace()
  • Нельзя использовать String.replaceAll()
  • Нельзя использовать регулярные выражения
  • Можно использовать StringBuilder или массив символов

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подход

Проходим по строке символ за символом, добавляя в StringBuilder только те символы, которые не являются пробелами. Используем StringBuilder для эффективного конкатенирования.

Решение

public class SpaceRemover {
    
    /**
     * Метод 1: Использование StringBuilder
     * Самый эффективный способ.
     */
    public static String removeSpacesWithStringBuilder(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        
        StringBuilder result = new StringBuilder();
        
        for (char c : str.toCharArray()) {
            if (c != ' ') {
                result.append(c);
            }
        }
        
        return result.toString();
    }
    
    /**
     * Метод 2: Использование цикла и конкатенации (неэффективно)
     */
    public static String removeSpacesWithConcat(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        
        String result = "";
        
        for (char c : str.toCharArray()) {
            if (c != ' ') {
                result += c;
            }
        }
        
        return result;
    }
    
    /**
     * Метод 3: Использование цикла с индексом и массивом char
     */
    public static String removeSpacesWithCharArray(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        
        char[] chars = str.toCharArray();
        char[] result = new char[chars.length];
        int index = 0;
        
        for (char c : chars) {
            if (c != ' ') {
                result[index++] = c;
            }
        }
        
        return new String(result, 0, index);
    }
    
    /**
     * Метод 4: Использование Stream API (Java 8+)
     */
    public static String removeSpacesWithStream(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        
        return str.chars()
                  .filter(c -> c != ' ')
                  .collect(StringBuilder::new, 
                          (sb, c) -> sb.append((char)c),
                          StringBuilder::append)
                  .toString();
    }
    
    /**
     * Вспомогательный метод для проверки всех вариантов
     */
    public static void testRemoveSpaces(String input) {
        System.out.println("Входная строка: \"" + input + "\"");
        System.out.println("Результат (StringBuilder): \"" + removeSpacesWithStringBuilder(input) + "\"");
        System.out.println("Результат (Concat): \"" + removeSpacesWithConcat(input) + "\"");
        System.out.println("Результат (CharArray): \"" + removeSpacesWithCharArray(input) + "\"");
        System.out.println("Результат (Stream): \"" + removeSpacesWithStream(input) + "\"");
        System.out.println();
    }
    
    public static void main(String[] args) {
        System.out.println("=== Удаление пробелов из строки ===\n");
        
        // Пример из задания
        testRemoveSpaces("Hello World Java");
        // Ожидаемо: HelloWorldJava
        
        // Пример с множественными пробелами
        testRemoveSpaces("Java   is   great");
        // Ожидаемо: Javaaisgreat
        
        // Пример с пробелами в начале и конце
        testRemoveSpaces("  Hello  ");
        // Ожидаемо: Hello
        
        // Пример с табуляцией (если требуется)
        testRemoveSpaces("Hello\tWorld");
        // Ожидаемо: HelloWorld или Hello\tWorld (в зависимости от требований)
        
        // Пустая строка
        System.out.println("Пустая строка: \"" + removeSpacesWithStringBuilder("") + "\"");
        
        // Null значение
        System.out.println("Null значение: " + removeSpacesWithStringBuilder(null));
        
        // Только пробелы
        System.out.println("Только пробелы: \"" + removeSpacesWithStringBuilder("     ") + "\"");
        
        // Нет пробелов
        System.out.println("Нет пробелов: \"" + removeSpacesWithStringBuilder("HelloWorld") + "\"");
    }
}

Сложность

  • Временная сложность: O(n), где n - длина строки
  • Пространственная сложность: O(m), где m - длина результата (без пробелов)

Примеры и тест-кейсы

  1. "Hello World Java" -> "HelloWorldJava"
  2. "Java is great" -> "Javaaisgreat"
  3. " Hello " -> "Hello"
  4. "" -> "" (пустая)
  5. "HelloWorld" -> "HelloWorld" (нет изменений)
  6. " " -> "" (только пробелы)

Edge cases и типичные ошибки

  1. Null значение: Проверяем перед началом
  2. Пустая строка: Возвращаем пустую строку
  3. Множественные пробелы: Все удаляются
  4. Табуляция (\t): Если требуется, нужно отдельно обработать
  5. Новые строки (\n): Аналогично табуляции
  6. Конкатенация строк: О(n^2) сложность в цикле - используйте StringBuilder
  7. Performance: StringBuilder - O(n), конкатенация в цикле - O(n^2)

StringBuilder - лучший выбор для этой задачи благодаря O(n) сложности.