Лучший способ перевернуть строку - PullRequest
385 голосов
/ 23 октября 2008

Мне просто нужно было написать функцию обратного преобразования строк в C # 2.0 (т. Е. LINQ недоступен) и придумал следующее:

public string Reverse(string text)
{
    char[] cArray = text.ToCharArray();
    string reverse = String.Empty;
    for (int i = cArray.Length - 1; i > -1; i--)
    {
        reverse += cArray[i];
    }
    return reverse;
}

Лично я не в восторге от этой функции и убежден, что есть лучший способ сделать это. Есть ли?

Ответы [ 42 ]

3 голосов
/ 03 февраля 2011

Как насчет:

    private string Reverse(string stringToReverse)
    {
        char[] rev = stringToReverse.Reverse().ToArray();
        return new string(rev); 
    }
3 голосов
/ 19 июня 2015

Извините за публикацию в этой старой теме. Я практикую некоторый код для интервью.

Это было то, что я придумал для C #. Моя первая версия перед рефакторингом была ужасной.

static String Reverse2(string str)
{
    int strLen = str.Length, elem = strLen - 1;
    char[] charA = new char[strLen];

    for (int i = 0; i < strLen; i++)
    {
        charA[elem] = str[i];
        elem--;
    }

    return new String(charA);
}

В отличие от метода Array.Reverse, приведенного ниже, он отображается быстрее с 12 или менее символами в строке. После 13 символов Array.Reverse начинает становиться быстрее, и в конечном итоге довольно сильно доминирует на скорости. Я просто хотел указать приблизительно, где скорость начинает меняться.

static String Reverse(string str)
{     
    char[] charA = str.ToCharArray();

    Array.Reverse(charA);

    return new String(charA);
}

При 100 символах в строке это быстрее, чем у моей версии x 4. Однако, если бы я знал, что строки всегда будут содержать менее 13 символов, я бы использовал ту, которую сделал.

Тестирование проводилось с Stopwatch и 5000000 итераций. Кроме того, я не уверен, что моя версия обрабатывает суррогаты или комбинированные символьные ситуации с кодировкой Unicode.

2 голосов
/ 06 декабря 2018

Самый простой способ:

string reversed = new string(text.Reverse().ToArray());
2 голосов
/ 16 февраля 2012

Если это когда-либо всплыло в интервью, и вам сказали, что вы не можете использовать Array. Он не создает новые строки и выполняет итерацию только для половины массива (т. Е. O (n / 2) итераций)

    public static string ReverseString(string stringToReverse)
    {
        char[] charArray = stringToReverse.ToCharArray();
        int len = charArray.Length-1;
        int mid = len / 2;

        for (int i = 0; i < mid; i++)
        {
            char tmp = charArray[i];
            charArray[i] = charArray[len - i];
            charArray[len - i] = tmp;
        }
        return new string(charArray);
    }
2 голосов
/ 23 октября 2008

«Лучший путь» зависит от того, что для вас важнее в вашей ситуации, производительности, элегантности, удобства обслуживания и т. Д.

В любом случае, вот подход с использованием Array.Reverse:

string inputString="The quick brown fox jumps over the lazy dog.";
char[] charArray = inputString.ToCharArray(); 
Array.Reverse(charArray); 

string reversed = new string(charArray);
2 голосов
/ 29 января 2014

Если у вас есть строка, содержащая только символы ASCII, вы можете использовать этот метод.

    public static string ASCIIReverse(string s)
    {
        byte[] reversed = new byte[s.Length];

        int k = 0;
        for (int i = s.Length - 1; i >= 0; i--)
        {
            reversed[k++] = (byte)s[i];
        }

        return Encoding.ASCII.GetString(reversed);
    }
2 голосов
/ 29 октября 2015
public static string reverse(string s) 
{
    string r = "";
    for (int i = s.Length; i > 0; i--) r += s[i - 1];
    return r;
}
1 голос
/ 09 октября 2014

Прежде всего вы должны понять, что str + = изменит размер вашей строковой памяти, чтобы освободить место для 1 дополнительного символа. Это хорошо, но если у вас есть, скажем, книга с 1000 страницами, которую вы хотите перевернуть, это займет очень много времени.

Решение, которое некоторые люди могут предложить, - это использовать StringBuilder. Что делает строитель строк, когда вы выполняете + =, так это то, что он выделяет гораздо большие куски памяти для хранения нового символа, так что ему не нужно перераспределять каждый раз, когда вы добавляете символ.

Если вы действительно хотите быстрое и минимальное решение, я бы предложил следующее:

            char[] chars = new char[str.Length];
            for (int i = str.Length - 1, j = 0; i >= 0; --i, ++j)
            {
                chars[j] = str[i];
            }
            str = new String(chars);

В этом решении есть одно начальное выделение памяти, когда инициализируется char [], и одно выделение, когда строковый конструктор строит строку из массива char.

В моей системе я провел для вас тест, который переворачивает строку из 2 750 000 символов. Вот результаты за 10 казней:

StringBuilder: 190K - 200K тиков

Char Char Array: 130K - 160K тиков

Я также запустил тест для нормальной строки + =, но я отказался от него через 10 минут без вывода.

Однако я также заметил, что для небольших строк StringBuilder работает быстрее, поэтому вам придется выбирать реализацию на основе входных данных.

Приветствия

1 голос
/ 21 февраля 2013
private static string Reverse(string str)
        {
            string revStr = string.Empty;
            for (int i = str.Length - 1; i >= 0; i--)
            {
                revStr += str[i].ToString();
            }
            return revStr;
        }

Быстрее, чем выше метод

private static string ReverseEx(string str)
        {
            char[] chrArray = str.ToCharArray();
            int len = chrArray.Length - 1;
            char rev = 'n';
            for (int i = 0; i <= len/2; i++)
            {
                rev = chrArray[i];
                chrArray[i] = chrArray[len - i];
                chrArray[len - i] = rev;
            }
            return new string(chrArray);
        }
1 голос
/ 14 февраля 2018

Как насчет использования подстроки

static string ReverseString(string text)
{
    string sub = "";
    int indexCount = text.Length - 1;
    for (int i = indexCount; i > -1; i--)
    {
        sub = sub + text.Substring(i, 1);
    }
    return sub;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...