朴素反转

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

  1. public static string NaiveReverse(string text)
  2. {
  3. string reverse = string.Empty;
  4. for (int i = text.Length - 1; i >= 0; i--)
  5. {
  6. reverse += text[i];
  7. }
  8.  
  9. return reverse;
  10. }

StringBuilder拼接

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

  1. public static string SBReverse(string text)
  2. {
  3. StringBuilder builder = new StringBuilder(text.Length);
  4. for (int i = text.Length - 1; i >= 0; i--)
  5. {
  6. builder.Append(text[i]);
  7. }
  8.  
  9. return builder.ToString();
  10. }

二分反转

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

  1. public static string BinaryReverse(string text)
  2. {
  3. char[] charArray = text.ToCharArray();
  4. int len = text.Length - 1;
  5.  
  6. for (int i = 0; i < len; i++, len--)
  7. {
  8. char tmp = charArray[i];
  9. charArray[i] = charArray[len];
  10. charArray[len] = tmp;
  11. }
  12.  
  13. return new string(charArray);
  14. }

指针操作

咦?字符串居然可变?

  1. public static unsafe string UnsafeReverse(string text)
  2. {
  3. fixed (char* pText = text)
  4. {
  5. char* pStart = pText;
  6. char* pEnd = pText + text.Length - 1;
  7. for (int i = text.Length / 2; i >= 0; i--)
  8. {
  9. char temp = *pStart;
  10. *pStart++ = *pEnd;
  11. *pEnd-- = temp;
  12. }
  13.  
  14. return text;
  15. }
  16. }

数组反转

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

  1. public static string ArrayReverse(string text)
  2. {
  3. char[] charArray = text.ToCharArray();
  4. Array.Reverse(charArray);
  5.  
  6. return new string(charArray);
  7. }

XOR操作

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

  1. public static string XorReverse(string text)
  2. {
  3. char[] charArray = text.ToCharArray();
  4. int len = text.Length - 1;
  5.  
  6. for (int i = 0; i < len; i++, len--)
  7. {
  8. charArray[i] ^= charArray[len];
  9. charArray[len] ^= charArray[i];
  10. charArray[i] ^= charArray[len];
  11. }
  12.  
  13. return new string(charArray);
  14. }

FCL实现

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

  1. public static string EnumReverse(string text)
  2. {
  3. char[] reverse = text.Reverse().ToArray();
  4.  
  5. return new string(reverse);
  6. }

测试

  1. Stopwatch watcher = new Stopwatch();
  2. // 字符串规模
  3. int[] sizes = new[] { 10, 100, 1000, 10000 };
  4. // 反转方法列表
  5. var ReverseMethods = new Func<string, string>[]
  6. {
  7. NaiveReverse,
  8. SBReverse,
  9. BinaryReverse,
  10. UnsafeReverse,
  11. ArrayReverse,
  12. XorReverse,
  13. EnumReverse
  14. };
  15.  
  16. for (int i = 0; i < sizes.Length; i++)
  17. {
  18. string text = new string('X', sizes[i]);
  19.  
  20. Console.WriteLine("For Size: {0}", sizes[i]);
  21. for (int j = 0; j < ReverseMethods.Length; j++)
  22. {
  23. var invoker = ReverseMethods[j];
  24.  
  25. watcher.Restart();
  26. invoker(text);
  27. watcher.Stop();
  28. Console.WriteLine("{0} Ticks: {1}", invoker.Method.Name, watcher.ElapsedTicks);
  29. }
  30. Console.WriteLine();
  31. }
  32.  
  33. 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. Spring【AOP】

    AOP是OOP的延续,是软件开发中的一个热点. AOP技术,是OOP补充. OOP引入封装.继承和多态建立一种对象层次结构模拟公共行为集合,而对从左到右的关系则显得无能为力.对于AOP则恰恰适应这样的 ...

  2. poj3671Dining Cows(DP)

    主题链接: 啊哈哈,点我点我 题意: 给一个仅仅含有1.2的序列,如何变换n次使序列成为一个非递减的序列,而且使n最小. 思路: 这道题的数据范围是50000,则肯定承受不了n方的复杂度.所以 仅仅能 ...

  3. jsRender模板引擎

    jsRender模板引擎 上一篇最后提到了模板,并尝试自己编写一个最简单版本:有些朋友可能用过 jqtmpl,这是一个基于jquery的模板引擎,不过它已经不再更新了,而且据说渲染速度比较慢.这里介绍 ...

  4. 章节2:SQL之多表连接

    原文:章节2:SQL之多表连接 Sql的多表连接关系有:内连接.外连接和交叉连接. 先建立两个用于演示的表: TB_Characters: Id Character 1 内向 2 外向 3 中性性格 ...

  5. Content://sms

    package com.example.sms; import android.app.Activity; import android.app.Notification; import androi ...

  6. python有些错误换行问题解决

    有时候数据会遇到一些错误包.例如,正确的数据应: 20141010,aaa,bbb,ccc,ddd,eee 但实际的数据是来: 20141010,aaa,bbb, ccc,ddd, eee 这样出现错 ...

  7. Java Main如何被执行?(转)

    java应用程序的启动在/hotspot/src/share/tools/launcher/java.c的main()函数中,而在虚拟机初始化过程中,将创建并启动Java的Main线程.最后将调用JN ...

  8. 如何有效地记录 Java SQL 日志(转)

    在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate . MyBatis 等.由于各种原因,我们有时会想知道 ...

  9. R语言做文本挖掘 Part5情感分析

    Part5情感分析 这是本系列的最后一篇文章,该.事实上这种单一文本挖掘的每一个部分进行全部值获取水落石出细致的研究,0基础研究阶段.用R里面现成的算法,来实现自己的需求,当然还參考了众多网友的智慧结 ...

  10. [Cocos2d-x]Cocos2d-x 3.2 学习笔记

    获取屏幕大小(Visible) Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Direc ...