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

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

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

Задача

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

Решение

Решений опять же много. Предлагаю все решения, где для разворота массива понадобился еще один массив считать незачётом. Можно это требование внести в условие, но, ИМХО, лучше посмотреть не предложит ли вдруг кандидат подобного решения и уже потом ввести это дополнительное ограничение. Единственным оправданием можно считать вопрос о том необходимо ли сохранить исходную строчку. Но это замечание не относится к 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);
}
  • А ограничение на используемые операции надо вводить? 🙂

    String reverseString (String s) {

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

    }

  • cap

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

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

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

  • omi891

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

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

    ЗЫ

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

  • OleGG

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

  • cap

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

  • ist

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

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

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

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

  • Pingback: Разворот строчки — новый вариант | Мысли вслух()

  • Антон

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

  • vitmgn

    Без массива можно так правда кол-во итераций будет больше

    String reverseString (String str)

    {

    String strr="";

    for (int i=(str.length () -1);i>=0;i--)

    {

    strr=strr+str.charAt (i);

    }

    return strr;

    }

  • Антон, стек можно. Как реализовать стек? 🙂

    vitmgn, это на Java? Плохой вариант. Курим StringBuffer, как минимум 🙂

  • vitmgn

    Алексей, задача стояла без массива попробовать, с StringBuilder тривиально

    public static String reverseString (String str)

    {

    StringBuilder stb=new StringBuilder (str);

    return stb.reverse ().toString ();

    }

  • vitmgn

    Сорри первый пост комментарий не увидел, это если не нужен многопоточный доступ, если нужен то StringBuffer.

    public static String reverseString (String str)

    {

    StringBuilder stb=new StringBuilder ();

    for (int i=(str.length () -1);i>=0;i--)

    {

    stb=stb.append (str.charAt (i));

    }

    return stb.toString ();

    }

  • vitmgn

    Алексей а нет списка вопросов по Spring и Hibernate (кроме многие-ко многим который был в блогое) для собеседований?