c#字符串三种逆转方法及性能比较
要求:给定一个字符串,将字符串逆转。例如给定“welcome to caochao's blog !”,要求输出“! golb s'oahcoac ot emoclew”。
初次看题时,想到的解法很可能就是倒序遍历字符串,逐位取字符,然后拼成新字符串,新字符串即为逆转后字符串。代码如下:
/// <summary> /// 字符串逆转-StringBuilder实现 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string ReverseUsingStringBuilder( string str) { int length = str.Length; StringBuilder sb = new StringBuilder(length); for ( int i = length - 1; i >= 0; i--) { sb.Append(str[i]); } return sb.ToString(); } |
,但其实,还有一种更为简单的方法,简单令人难以置信,看到这个方法时不得不惊叹于.net framework方法的齐全。代码如下:
/// <summary> /// 字符串逆转-CharArray实现 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string ReverseUsingCharArray( string str) { char [] arr = str.ToCharArray(); Array.Reverse(arr); return new string (arr); } |
但仔细一想,也许还有种更快的,至少从原理上看起来应该会快点。这种方法从字符串两端同时遍历,再逐位交换值。代码如下:
/// <summary> /// 字符串逆转-异或实现 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string ReverseUsingXor( string str) { char [] arr = str.ToCharArray(); int l = str.Length - 1; //交换值 for ( int i = 0; i < l; i++, l--) { arr[i] ^= arr[l]; arr[l] ^= arr[i]; arr[i] ^= arr[l]; } return new string (arr); } |
至此,讲完了字符串逆转的三种方法。也许看客还有更好的方法,就请在评论里留下您的高见吧。:-)
如同电影和电视剧时,最精彩的部分往往在后半部分。因此,小生的文章也把最重要的部分挪到了后面。笔者设计了一个测试方法,从而测试出以上三种字符串逆转方法的性能优劣。该方法如下:
public delegate string funcDelegate( string s); /// <summary> /// 测试方法 /// </summary> /// <param name="description">方法描述</param> /// <param name="func">测试方法</param> /// <param name="times">执行次数</param> /// <param name="str">测试字符串</param> public static void Benchmark( string description, funcDelegate func, int times, string str) { Stopwatch sw = new Stopwatch(); sw.Start(); for ( int j = 0; j < times; j++) { func(str); } sw.Stop(); Console.WriteLine( "方法{0}:调用{1}次,用时{2}." , description, times, sw.ElapsedTicks); } |
还有一个生成随机字符串的方法,请看代码:
/// <summary> /// 生成指定长度随机字符串 /// </summary> /// <param name="length">字条串长度</param> /// <returns></returns> public static string RandomString( int length) { Random random = new Random(); StringBuilder sb = new StringBuilder(); for ( int i = 0; i < length; i++) { sb.Append(Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)))); } return sb.ToString(); } |
接下来,主角隆重登场。请看Main入口方法:
static void Main( string [] args) { int [] lengths = new int [] { 1, 10, 15, 25, 50, 75, 100, 1000, 100000 }; foreach ( int len in lengths) { //每个方法都执行10000次,力求精确 int iterations = 10000; //生成随机测试字符串 string testString = StringReverse.RandomString(len); //打印测试信息 StringReverse.Benchmark(String.Format( "String Builder (测试字符串长度为{0})" , len), StringReverse.ReverseUsingStringBuilder, iterations, testString); StringReverse.Benchmark(String.Format( "Array.Reverse (测试字符串长度为{0})" , len), StringReverse.ReverseUsingCharArray, iterations, testString); StringReverse.Benchmark(String.Format( "Xor (测试字符串长度为{0})" , len), StringReverse.ReverseUsingXor, iterations, testString); Console.WriteLine(); } Console.Read(); } |
运行后看结果。结果在这里:
结论:从运行结果可以看出,
异或实现的逆转方法,随着字符串长度的递增,用时越来越长。但在字符串长度较小时,为三种方法中性能最好的。
StringBuilder实现的字符串逆转,无论字符串长度大小,都是性能最差的。个人估计是开辟新内存的开销带来的性能上的损失。
Array.Reverse实现的字符串逆转,这种最傻瓜的方法,却是在以上三种方法中性能表现最稳定的。个中原因,由看客们评价吧。
最后,附上stackoverflow上关于c#字符串逆转算法的一个讨论帖地址
http://stackoverflow.com/questions/228038/best-way-to-reverse-a-string-in-c-sharp-2-0
邮箱: caochao88@gmail.com
出处: http://www.cnblogs.com/tudas
本文版权归作者和博客园共有,欢迎转载,未经作者同意须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?