C#编程实践--字符串反转

朴素反转

朴素解法,倒序遍历,字符串拼接,字符串性能低下,在长度已知的前提可以使用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();

结语

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

时间: 2024-10-05 04:19:22

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

编程珠玑字符串反转

编程珠玑真是一本让人感觉到眼前一亮的书,虽然书不厚,但是里面的知识很贴近实际应用,也很有启发性,如果能真正的消化里面的内容,对程序的理解肯定会上一个档次. 本文给出的是第二章习题的第五题的大概程序! #include<iostream> using namespace std; void move(int * arr, int arrsize,int n);//将数组arr的前n个元素左移 void show(int * arr,int arrsize); void reverse(int *

Go基础编程实践——字符串

修剪空格 strings包中的TrimSpace函数用于去掉字符串首尾的空格. package main import ( "fmt" "strings" ) func main() { helloWorld := "\t Hello, World " trimHello := strings.TrimSpace(helloWorld) fmt.Printf("%d %s\n", len(helloWorld), helloW

编程实践积累

1 编程经验实践,积累,总结,分享 2 3 4 博客地址:http://www.cnblogs.com/liaowanzhong/ 5 6 7 8 9 10 11 12 13 14 15 1. 大量群发邮件:购买Edm服务,大的互联网企业是和邮箱服务商签订协议(百度,腾讯,京东,阿里,csdn) 16 站内信 17 内网发短信:短信猫 18 19 2. Servlet Filter 生命周期 20 *Servlet:看配置文件中web.xml配置其启动的优先级别,即当load-on-startu

Java编程基础-字符串

在Java语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:另一类是在程序中会被改变长度的可变字符串.Java环境为了存储和维护这两类字符串提供了 String和StringBuffer两个类(在JDK1.5版本后出现了StringBuilder,该类被设计用作 StringBuffer 的一个简易替换). 一.字符串(String) 1.字符串概念了解 String 类代表字符串,Java 程序中的所有字符串字面值(如 "ab

关于字符串反转和数组反转的问题

关于反转这个问题,在晚上查了些资料,有很多非常不错的思想,要熟练的掌握这些思想,现在把这些总结如下: 字符串反转: 1 import java.util.Stack; 2 3 public class StringInverse { 4 public static void main(String[] args) { 5 System.out.println(reverse7("abcde")); 6 } 7 //方式一 8 public static String reverse1(

Storm实时计算:流操作入门编程实践

转自:http://shiyanjun.cn/archives/977.html Storm实时计算:流操作入门编程实践 Storm是一个分布式是实时计算系统,它设计了一种对流和计算的抽象,概念比较简单,实际编程开发起来相对容易.下面,简单介绍编程实践过程中需要理解的Storm中的几个概念: Topology Storm中Topology的概念类似于Hadoop中的MapReduce Job,是一个用来编排.容纳一组计算逻辑组件(Spout.Bolt)的对象(Hadoop MapReduce中一

高性能JavaScript 编程实践

前言 最近在翻<高性能JavaScript>这本书(2010年版 丁琛译),感觉可能是因为浏览器引擎的改进或是其他原因,书中有些原本能提高性能的代码在最新的浏览器中已经失效.但是有些章节的有些内容还是相当不错的,譬如第八章编程实践,为了方便以后的查阅,对此做个总结.失效的代码也会在以后做更进一步的探索. 避免双重求值 这个优化策略很好理解,我们可能都已经不知不觉地运用在了实际的编程中: // not use this setTimeout('alert("hello world&qu

Java面试题从零开始:写一个函数把字符串反转

前言:为了能够找一个代表我从零开始的诗词,我挖空心思去找,然而怎么也找不到一个贴合我心意的,被迫上了度娘也不曾找到.真想把小学一年级的语文课本拿出来好好的通读一遍,肯定能找到答案. 好了,既然找不到也不必耿耿于怀了.今天读了<高效能程序员的修炼>第四章,发现自己好烂,如果按照作者的看法,我是无论如何都入不了他的法眼,于是乎,我告诉自己,从零开始,把作者提出的面试题按照Java来写一遍,无论是参考别人还是自己略能想得到的办法,亲自动手把它们敲出来,并且记录下来吧! 写一个函数把字符串反转,作为本

《编写可维护的javascript》读书笔记(中)——编程实践

上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. 二.编程实践 1.UI松耦合 第一.将css从javascript中抽离(要改变dom样式数据,应该去操作dom的class名而非dom的style属性,后续要修改此样式只需到对应的css文件中修改而不用修改js文件): 第二.将javascript从HTML中抽离,比如下面的写法是不好的 <!-- 不