朴素反转

朴素解法,倒序遍历,字符串拼接,字符串性能低下,在长度已知的前提可以使用char数组代替

public static string NaiveReverse(string text)
{
string reverse = string.Empty;
for (int i = text.Length - 1; i >= 0; i--)
{
reverse += text[i];
} return reverse;
}

StringBuilder拼接

进一步改进,使用StringBuilder进行拼接字符串

public static string SBReverse(string text)
{
StringBuilder builder = new StringBuilder(text.Length);
for (int i = text.Length - 1; i >= 0; i--)
{
builder.Append(text[i]);
} return builder.ToString();
}

二分反转

遍历次数降低到一半,效果如何?

public static string BinaryReverse(string text)
{
char[] charArray = text.ToCharArray();
int len = text.Length - 1; for (int i = 0; i < len; i++, len--)
{
char tmp = charArray[i];
charArray[i] = charArray[len];
charArray[len] = tmp;
} return new string(charArray);
}

指针操作

咦?字符串居然可变?

public static unsafe string UnsafeReverse(string text)
{
fixed (char* pText = text)
{
char* pStart = pText;
char* pEnd = pText + text.Length - 1;
for (int i = text.Length / 2; i >= 0; i--)
{
char temp = *pStart;
*pStart++ = *pEnd;
*pEnd-- = temp;
} return text;
}
}

数组反转

最容易理解的方式,往往是最高效的,为啥这么高效?

public static string ArrayReverse(string text)
{
char[] charArray = text.ToCharArray();
Array.Reverse(charArray); return new string(charArray);
}

XOR操作

是不是很有逼格?其实对于理解位操作还是有点帮助,至于性能嘛。。。

public static string XorReverse(string text)
{
char[] charArray = text.ToCharArray();
int len = text.Length - 1; for (int i = 0; i < len; i++, len--)
{
charArray[i] ^= charArray[len];
charArray[len] ^= charArray[i];
charArray[i] ^= charArray[len];
} return new string(charArray);
}

FCL实现

升级到.NET3.5了吗?OK,最少的代码实现,可是性能嘛,额

public static string EnumReverse(string text)
{
char[] reverse = text.Reverse().ToArray(); return new string(reverse);
}

测试

Stopwatch watcher = new Stopwatch();
// 字符串规模
int[] sizes = new[] { 10, 100, 1000, 10000 };
// 反转方法列表
var ReverseMethods = new Func<string, string>[]
{
NaiveReverse,
SBReverse,
BinaryReverse,
UnsafeReverse,
ArrayReverse,
XorReverse,
EnumReverse
}; for (int i = 0; i < sizes.Length; i++)
{
string text = new string('X', sizes[i]); Console.WriteLine("For Size: {0}", sizes[i]);
for (int j = 0; j < ReverseMethods.Length; j++)
{
var invoker = ReverseMethods[j]; watcher.Restart();
invoker(text);
watcher.Stop();
Console.WriteLine("{0} Ticks: {1}", invoker.Method.Name, watcher.ElapsedTicks);
}
Console.WriteLine();
} Console.ReadLine();

结语

写这些代码到底有什么意义?性能到底如何?好了,那么问题来了

C#编程实践--字符串反转的更多相关文章

  1. 1031: [编程入门]自定义函数之字符串反转(python)

    问题 1031: [编程入门]自定义函数之字符串反转 时间限制: 1Sec 内存限制: 128MB 提交: 7225 解决: 3331 题目描述 写一函数,使输入的一个字符串按反序存放,在主函数中输入 ...

  2. 2018.6.19 Java核心API与高级编程实践复习总结

    Java 核心编程API与高级编程实践 第一章 异常 1.1 异常概述 在程序运行中,经常会出现一些意外情况,这些意外会导致程序出错或者崩溃而影响程序的正常执行,在java语言中,将这些程序意外称为异 ...

  3. 高性能javascript学习笔记系列(5) -快速响应的用户界面和编程实践

    参考高性能javascript 理解浏览器UI线程  用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程  UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 ...

  4. 高性能JavaScript 编程实践

    前言 最近在翻<高性能JavaScript>这本书(2010年版 丁琛译),感觉可能是因为浏览器引擎的改进或是其他原因,书中有些原本能提高性能的代码在最新的浏览器中已经失效.但是有些章节的 ...

  5. 编程实践中C语言的一些常见细节

    对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...

  6. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

  7. 《编写可维护的JavaScript》之编程实践

    最近读完<编写可维护的JavaScript>,让我受益匪浅,它指明了编码过程中,需要注意的方方面面,在团队协作中特别有用,可维护性是一个非常大的话题,这本书是一个不错的起点. 本书虽短,却 ...

  8. JavaScript八张思维导图—编程实践

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...

  9. Python入门经典. 以解决计算问题为导向的Python编程实践

    Python入门经典. 以解决计算问题为导向的Python编程实践(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1juLsew8UiOErRheQPOuTaw 提取 ...

随机推荐

  1. c++读取文本文件

    #include<iostream> #include<fstream> using namespace std; int main() { int a,b=-100000,c ...

  2. [Sqlite] --&gt; Sqlite于Windows、Linux 和 Mac OS X 在安装过程

    一个:于 Windows 安装 SQLite  1,下载 请訪问SQLite下载页面http://www.sqlite.org/download.html.从Windows 区下载预编译的二进制文件. ...

  3. SQL 将URL编码转汉字!

    原文:SQL 将URL编码转汉字! -- ============================================= -- 作 者: ruijc -- 描 述: 将Url编码转明文字符 ...

  4. OC省字典的数组摘要集

    开放式党员 NSString *filePath = @"/Users/dlios/Downloads/area.txt"; 推断错误值 打印出来 NSError *error = ...

  5. 军医王-moTestin云测试看好移动医疗行业

    看医生汪谟军:Testin云測在移动医疗产业大有可为 2014/10/21 · Testin · 开发人员訪谈 日常生活可能常常碰到这种情况:突然遇上头疼脑热.小病小痛,去医院又不方便:非常想了解家人 ...

  6. C语言优化实例:为了消除嵌套switch-case聪明的做法

    我们有可能会写出或者遇到类似这种代码: C/C++ switch (expr1) { case label11: switch (expr2) { case label21: // do someth ...

  7. UI測试内容

    我们在实际工作其中,针对web应用程序,也就是常常所说的B/S系统,能够从例如以下方面来进行用户界面測试: 导航測试 导航描写叙述了用户在一个页面内操作的方式,在不同的用户接口控制之间,比如butto ...

  8. 《代码的第一行——Android》封面诞生

    <代码的第一行--Android>已经上市近一个月,现在的情况是相当不错的销售,也特别感谢众多朋友的支持. 其实一本好书,假设你想卖.除了给予外力所要求的内容.封面设计是至关重要的,这本书 ...

  9. JQUERY prop与attr差额

    1.  1-9-1之前和之后之间的差 <html> <script src="Js/jquery-1.9.0.js" type="text/javasc ...

  10. Ajax得知(两)—— 一个简单的Ajax示例

    通过部分博客认识Ajax之后,我们通过一个简单的实例来消化消化理论知识,一睹Ajax的庐山真面目. 1.实例功能: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...