Янв
22
2009

Разворот строчки

Задачка классическая и очень простая. Посему имеет смысл ее использовать только для совсем уж начинающих программистов.

Хотя меня как-то недавно тоже попросили ее решить :)

Задача

Развернуть строку символов. Как вариант, можно попросить развернуть массив.

Решение

Решений опять же много. Предлагаю все решения, где для разворота массива понадобился еще один массив считать незачётом. Можно это требование внести в условие, но, ИМХО, лучше посмотреть не предложит ли вдруг кандидат подобного решения и уже потом ввести это дополнительное ограничение. Единственным оправданием можно считать вопрос о том необходимо ли сохранить исходную строчку. Но это замечание не относится к Java, т.к. там придется выносить символы из строки в массив. И этот массив, очевидно, беречь нам ни к чему.

Краше всего на C/C++, где строчки — те же самые массивы. Будем использовать такую милую любому настоящему программисту на C арифметику указателей.

void reverseString(char *str)
{
    int i = 0;
    int len = strlen(str)-1;
    for (; i <= len/2; i++)
    {
        char c = *(str+i);
        *(str+i) = *(str+len-i);
        *(str+len-i) = c;
    }
}

На Java, как я говорил, выглядит менее элегантно, т.к. со строкой нельзя работать, как с массивом. И получатеся нечто вроде:

String reverseString(String s) {
    char []str = s.toCharArray();
    int len = str.length-1;
    for (int i = 0; i <= len/2; i++) {
        char c = str[i];
        str[i] = str[len-i];
        str[len-i] = c;
    }
    return new String(str);
}

8 комментариев »

  • А ограничение на используемые операции надо вводить? :)

    String reverseString (String s) {

    return new StringBuilder (string).reverse ().toString ();

    }

  • cap пишет:

    Надо или не надо вводить такое ограничение — спорный вопрос.

    С одной стороны нам надо решить задачу, а этим способом она несомненно решена.

    С другой стороны, если очень хочется посмотреть именно реализацию, я бы такой ответ засчитал, но попросил бы написать еще и руками.

  • omi891 пишет:

    ООООО! Классика просто!

    Где-то 20 лет назад решали с изворотами подобные простые, но хитрые алгоритмы ;-)

    ЗЫ

    Интересно сколько осталось человек,которые могут это решить ;-)

  • OleGG пишет:

    Лишнюю память используете =) Есть же классическое a^=b^=a^=b. В лоб, правда, не всякий компилер даст сделать, но вот в 3 строки обмен точно можно записать без буферной переменной.

  • cap пишет:

    Ну да, ну да. Можно и так. Но время выполнения будет больше.

  • ist пишет:

    Меня как то просили на собеседовании развернуть предложение, при этом пользоватся только этим же массивом. пример

    вх: привет мир

    вых: мир привет

    Я решил ее так, сначала развернул весь массив символов, потом каждое слово разворачивал обратно.

  • [...] кандидатом, на должность тестера в нашу команду, задачу про разворот строчки, мне на ум пришло новое забавное решение этой [...]

  • Антон пишет:

    А не проще ли посвильно сложить эту строку в стек, а зате также посимвольно вынуть.

RSS feed for comments on this post. TrackBack URL


Leave a Reply

Powered by WordPress | Theme: Aeros 2.0 by TheBuckmaker.com