关于字符串反转的几种方法的比较

  下面先上代码:

    class Program
    {
        static void Main(string[] args)
        {
            string str = "12345";
            const int count = 10000;

            Stopwatch sw = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                Reverse1(str);
            }
            Console.WriteLine("Reverse1耗时: {0}", sw.Elapsed);

            sw = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                Reverse2(str);
            }
            Console.WriteLine("Reverse2耗时: {0}", sw.Elapsed);

            sw = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                Reverse3(str);
            }
            Console.WriteLine("Reverse3耗时: {0}", sw.Elapsed);

            Console.ReadLine();
        }

        /// <summary>
        /// 使用string拼接字符串
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string Reverse1(string str)
        {
            string strReturn = "";
            foreach (char c in str)
            {
                strReturn = c + strReturn;
            }
            return strReturn;
        }

        /// <summary>
        /// 使用StringBuilder拼接字符串
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string Reverse2(string str)
        {
            if (String.IsNullOrEmpty(str))
            {
                throw new ArgumentNullException("字符串为空!");
            }

            StringBuilder sb = new StringBuilder(str.Length);
            for (int i = str.Length - 1; i >= 0; i--)
            {
                sb.Append(str[i]);
            }
            return sb.ToString();
        }

        /// <summary>
        /// 使用FCL自带的Array.Reverse()
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string Reverse3(string str)
        {
            var arr = str.ToCharArray();
            Array.Reverse(arr);
            return new string(arr);
        }

    }

当前的循环次数为10000次,对比结果如图:

显然,三种反转算法的性能比较为:Reverse1<Reverse2<Reverse3,我们把循环次数增大至1000000次,对比结果如图:

  从笔者的机器上的运行结果来看,性能比较结果依然为Reverse1<Reverse2<Reverse3。简单说一下为什么会有这样的结果。Reverse1()和Reverse2()中主要是用字符串拼接实现的反转,关于字符串的拼接,用StringBuilder要比用String要好的多,这主要跟string的不可变性有莫大关系。如果用Reflector.exe工具反汇编查看FCL自带的Array.Reverse(),你会发现其代码做了相当多的优化,而且并没有使用字符串拼接来辅助实现字符串的反转,它内部使用了数组(Array)元素的位置交换实现的字符串反转。

时间: 2024-08-06 12:36:25

关于字符串反转的几种方法的比较的相关文章

趣味算法:字符串反转的N种方法(转)

老赵在反对北大青鸟的随笔中提到了数组反转.这的确是一道非常基础的算法题,然而也是一道很不平常的算法题(也许所有的算法深究下去都会很不平常).因为我写着写着,就写出来8种方法……现在我们以字符串的反转为例,来介绍这几种方法并对它们的性能进行比较. 使用Array.Reverse方法 对于字符串反转,我们可以使用.NET类库自带的Array.Reverse方法 public static string ReverseByArray(this string original) { char[] c =

javascript 实现字符串反转的两种方法

第一种方法:利用数组方法 //先split将字串变成单字数组,然后reverse()反转,然后将数组拼接回字串 var str = "abcdef"; str.split("").reverse().join('') 第二种方法:暴力遍历 var str="abcdef" ,str2=""; var i=str.length; i=i-1; for (var x = i; x >=0; x--) { str2 += st

python 实现字符串反转的几种方法

1.字符串切片 s = "hello" reversed_s = s[::-1] print(reversed_s) >>> olleh 2.列表的reverse方法 s = "hello" l = list(s) l.reverse() reversed_s = "".join(l) print(s) >>> olleh 3.使用reduce函数 在python2中可直接使用reduce函数,在python3

[转]Python实现字符串反转的几种方法

#第一种:使用字符串切片 result = s[::-1] #第二种:使用列表的reverse方法 l = list(s) l.reverse() result = "".join(l) #当然下面也行 l = list(s) result = "".join(l[::-1]) #第三种:使用reduce result = reduce(lambda x,y:y+x,s) #第四种:使用递归函数 def func(s): if len(s) <1: retur

python 字符串反转的几种方法

1.用reduce函数方法 book = 'Python程序设计' result = reduce(lambda x,y:y+x,book) print(result) 2.字符串切割 book = 'Python程序设计' print(book[::-1]) 3.用reversed方法,把字符串变成列表反转后拼接 result = reversed(list(book)) print(''.join(result)) 4.for循环 book = 'Python程序设计' lenbook =

c++中字符串反转的3种方法

第一种:使用algorithm中的reverse函数 #include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string s = "hello"; reverse(s.begin(),s.end()); cout<<s<<endl; return 0; } 第二种:自己编写 #include &l

字符串反转的3种方法

0x00 自己写一个 // 第一种 std::string reverse(std::string str) { std::string res(""); for (int i = str.size() - 1; i >= 0; i--) { res += str[i]; } return res; } // 第二种 int main(void) { std::string str("abcde"); int i = 0, j = str.size() - 1

单链表反转的2种方法

1 public class ReverseDemo { 2 3 /** 4 * 单链表反转的两种方法 5 */ 6 public static void main(String[] args) { 7 Node head =new Node("a"); 8 Node node2=new Node("b"); 9 Node node3=new Node("c"); 10 head.setNext(node2); 11 node2.setNext(

JavaScript学习笔记第一天——字符串连接的N种方法

Javascript 字符串的连接方法有多种,但效率却有很大区别. 1.逐个字符串相加 var arr = ['item 1', 'item 2', 'item 3', ...]; var list = ''; for (var i = 0, l = arr.length; i < l; i++) { list += '<li>' + arr[i] + '</li>'; } list = '<ul>' + list + '</ul>'; 这种最常见的,