加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 一种快速反转字符串的方法?

发布时间:2020-12-15 19:37:55 所属栏目:百科 来源:网络整理
导读:参见英文答案 Best way to reverse a string????????????????????????????????????42个 下面是我可以创建的用于反转String的最快代码 public static void ReverseFast(string x){ string text = x; StringBuilder reverse = new StringBuilder(); for (int i
参见英文答案 > Best way to reverse a string????????????????????????????????????42个
下面是我可以创建的用于反转String的最快代码

public static void ReverseFast(string x)
{
    string text = x;
    StringBuilder reverse = new StringBuilder();

    for (int i = text.Length - 1; i >= 0; i--)
    {
        reverse.Append(text[i]);
    }
      Console.WriteLine(reverse);
}

我想解决这个等式中的每个瓶颈,使其尽可能快.到目前为止我唯一能找到的是阵列边界检查,我只是部分理解.无论如何都要禁用它,因为我理解它如果你使用.Length编译器决定不检查边界但是如果你正在递减,因为我在for循环它仍然进行边界检查?有人可以将此转换为使用指针,这将避免边界检查,我想测试100k字符范围内的字符串的速度差异.

根据下面的评论和帖子,这是我到目前为止所提出的.

public static void ReverseFast(string x)
{
    StringBuilder reverse = new StringBuilder(x.Length);
    for (int i = x.Length - 1; i >= 0; i--)
    {
        reverse.Append(x[i]);
    }
    Console.WriteLine(reverse);
}

上述解决方案比建议的重复问题答案快得多.这个问题实际上解决了5000 * 26字符范围内的逆转问题.我仍然希望使用指针来测试它,以确定是否没有瓶颈,尤其是如此大量的字符.

解决方法

这是一个基于指针的解决方案:

unsafe String Reverse(String s)
        {
            char[] sarr = new char[s.Length];
            int idx = s.Length;
            fixed (char* c = s)
            {
                char* c1 = c;
                while (idx != 0)
                {
                    sarr[--idx] = *c1++;
                }
            }

            return new String(sarr);
        }

摆脱数组索引(sarr [ – idx])以下可能更快:

unsafe String Reverse(String s)
        {
            char[] sarr = new char[s.Length];
            fixed (char* c = s)
            fixed (char* d = sarr)
            {
                char* c1 = c;
                char* d1 = d + s.Length;
                while (d1 > d)
                {
                    *--d1 = *c1++;
                }
            }

            return new String(sarr);
        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读