Вечер фейспалмов продолжается

А вот мне рассказали, чему учат юных джавистов в TU D-stadt. Задание простое – проверить, является ли текстовая строка палиндромом (без учета пробелов) – скажем, таковыми будут “шалаш” или “оголи жопу пожилого” (привет Пенсионному фонду). Ну как это делает нормальный человек? Заводим указатели на начало и конец строки, двигаем их навстречу друг другу, пропуская пробелы, и сравниваем буквы.

palindrom

Так вот, сейчас студентов учат немного другому. Надо сначала выполнить метод trim(), отрезав от строки пробелы в начале и в конце, потом сравнить первую букву с последней, затем выполнить метод substring() и повторить это с обрезанной строкой. Прикольно, да? Не знаю, как у вас, а я не могу обойтись без слов “пиздец”, “охуеть” и “ебланы”, когда рассказываю об этом.

16 комментариев

  1. kettle пишет:

    А попробуйте-ка свои указатели, когда у вас строка в utf, скажем, 8. Не обломаетесь?

    • Не обломаюсь.

      • kettle пишет:

        Уверены, что ваше *begin++ == *end– прокатит?

        • ну тут чуть посложнее будет, но принципиально ничего нового

          • kettle пишет:

            сдается мне, вам просто в голову не пришло про многобайтные кодировки.
            trim/substr будут давать одинаковый результат в любой кодировке, а ваш самописный “немного сложнее” придется переписывать под каждую отдельно.

            Кстати, а в яве есть указатели типа char* ?
            Это не чисто-ли сишная возможность выстрелить себе в ногу?

            • С многобайтными кодировками сильно сложнее не будет – разве что указатель придется двигать на несколько байт иногда. С передним в UTF-8 все понятно, а задний просто двигаем синхронно с передним.

              В Java вместо указателей используем индексы в массиве, ну или charAt().

              • kettle пишет:

                Не иногда, а практически всегда. Причем двигать ниразу не синхронно, потому что сначала надо задний сдвинуть до начала символа, а потом уже вместе с передним двигать вперед со сравнением. При этом не забыв пропускать все, что is_space. Надеюсь, это вы не предлагаете прямым сравнением делать?

                И что, кстати, вернет charat – байт или символ?

  2. Михаил пишет:

    Так они ж там в Java не знают что такое указатель.

    • Но charAt() у них все же есть.

      • Михаил пишет:

        По поводу “оптимальности” приведенного алгоритма вы конечно же правы. Просто срачик в коментах идет в понятиях C/C++ – указатели, типы данных. Вообще-то начинать изучение программирования с Java – вкорне неправильно. Потом очень трудно понять что такое указатель, когда объект копируется, а когда передается по ссылке, зачем освобождать память и т.д. В другую сторону тоже есть трудности, например, непонятно какого хрена оператор = не создает копию объекта.