字符串反转的9种方法

 

面是实现字符串反转的四种格局:

转自:

方法一:

图片 1            static string Reverse1(string original)
图片 2图片 3            ...{
图片 4                char[] arr = original.ToCharArray();
图片 5                Array.Reverse(arr);
图片 6                return new string(arr);
图片 7            }
图片 8
图片 9            static string Revease21(string original)
图片 10图片 11            ...{
图片 12                int length = original.Length;
图片 13                char[] arr = new char[length];
图片 14                for (int i = 0; i < (length & (~3)); i += 4)
图片 15图片 16                ...{
图片 17                    arr[i] = original[length - i - 1];
图片 18                    arr[i+1] = original[length - i - 2];
图片 19                    arr[i+2] = original[length - i - 3];
图片 20                    arr[i+3] = original[length - i - 4];
图片 21                }
图片 22                for (int i = length & (~3); i < length; i++)
图片 23图片 24                ...{
图片 25                    arr[i] = original[length - i - 1];
图片 26                }
图片 27                return new string(arr);
图片 28            }
图片 29
图片 30            static string Revease22(string original)
图片 31图片 32            ...{
图片 33                int length = original.Length;
图片 34                char[] arr = new char[length];
图片 35                for (int i = 0; i < length; i++)
图片 36图片 37                ...{
图片 38                    arr[i] = original[length - i - 1];
图片 39                }
图片 40                return new string(arr);
图片 41            }
图片 42
图片 43            static string Revease3(string original)
图片 44图片 45            ...{
图片 46                int length = original.Length;
图片 47                StringBuilder sb = new StringBuilder(length);
图片 48                for (int i = length-1; i >= 0; i--)
图片 49                sb.Append(original[i]);
图片 50                return sb.ToString();
图片 51            }

 

public static string Reverse(string name)
{
     if (String.IsNullOrEmpty(name))
       {
           throw new Exception("字符串不能够为空!"卡塔尔(英语:State of Qatar);
       }
    StringBuilder sb = new StringBuilder(name.Length);
    for (int i = name.Length-1; i >= 0; i--)
     {
        sb.Append(name[i]);
    }
        return sb.ToString();
}

 Revease1()中对char[]进行了一次赋值(ToCharArray()和Array.Revease卡塔尔,所以小编有想到了Revease2和Revease3(卡塔尔二种艺术,下边是对那多样方式开展简要质量测验的代码:

1. 使用Array.Reverse方法

 

图片 52   static void Main(string[] args)
图片 53图片 54            ...{
图片 55                string testString = "测验字符串反转测量检验字符串反转测验字符串反转测验字符串反转测验字符串反转测量检验字符串反转测验字符串反转测量试验字符串反转测量检验字符串反转测量试验字符串反转测验字符串反转测量试验字符串反转测验字符串反转测验字符串反转测量检验字符串反转测量试验字符串反转测量试验字符串反转测量试验字符串反转测量试验字符串反转测验字符串反转测验字符串反转测量检验字符串反转测量检验字符串反转测量检验字符串反转测量试验字符串反转测量检验字符串反转测量试验字符串反转测验字符串反转测量试验字符串反转测验字符串反转测量检验字符串反转测量检验字符串反转";
图片 56                DateTime start = DateTime.Now;
图片 57                for (int i = 0; i < 3000000; i++)
图片 58图片 59                ...{
图片 60                    string s = Reverse1(testString);
图片 61                }
图片 62                DateTime end = DateTime.Now;
图片 63                Console.WriteLine("1 :  "+(end - start));
图片 64
图片 65                start = DateTime.Now;
图片 66                for (int i = 0; i < 3000000; i++)
图片 67图片 68                ...{
图片 69                    string s = Revease21(testString);
图片 70                }
图片 71                end = DateTime.Now;
图片 72                Console.WriteLine("21:  " + (end - start));
图片 73
图片 74                start = DateTime.Now;
图片 75                for (int i = 0; i < 3000000; i++)
图片 76图片 77                ...{
图片 78                    string s = Revease22(testString);
图片 79                }
图片 80                end = DateTime.Now;
图片 81                Console.WriteLine("22:  " + (end - start));
图片 82
图片 83                start = DateTime.Now;
图片 84                for (int i = 0; i < 3000000; i++)
图片 85图片 86                ...{
图片 87                    string s = Revease3(testString);
图片 88                }
图片 89                end = DateTime.Now;
图片 90                Console.WriteLine("3 :  " + (end - start));
图片 91
图片 92                Console.ReadLine();
图片 93            }

对此字符串反转,大家得以使用.NET类库自带的Array.Reverse方法

方法二:.NET3.5以上

测量检验结果是Revease1(卡塔尔(قطر‎代码最简洁明了,运维速度也最快,Revease21(卡塔尔和Revease22(卡塔尔国其次,Revease3(卡塔尔最慢。可以知道.net framework中达成的ToCharArray(卡塔尔和Array.Revease(卡塔尔功效依旧蛮高的^_^

public static string ReverseByArray(string original)
{
char[] c = original.ToCharArray();
Array.Reverse(c);
return new string(c);
}

public static string Reverse(string name)
{
     char[] reverse = name.Reverse().ToArray();

但还会有个意料之外的标题,便是Debug版本中的Revease1(卡塔尔和Revease21(卡塔尔(قطر‎运营起来要比Release版本中的要快,而Revease22(卡塔尔(英语:State of Qatar)和Revease3(卡塔尔(قطر‎就比较符合规律。按说Release时做了越多的优化办事,运营起来越来越快才对,吸引ing...,上面是测量试验结果:

2. 使用字符缓存

     return new string(reverse);
}

Debug:

在面试或笔试中,往往须要不用别的类库方法,那么有心上人民代表大会致会使用近似上面那样的轮回方法

 

1 :  00:00:03.4375000
21:  00:00:06.1250000
22:  00:00:09.9687500
3 :  00:01:05.5468750

public static string ReverseByCharBuffer(this string original)
{
char[] c = original.ToCharArray();
int l = original.Length;
char[] o = new char[l];
for (int i = 0; i < l ; i++)
{
o[i] = c[l - i - 1];
}
return new string(o);
}

方法三:二分法

Release:

自然,聪明的校友们显然会开采不必对那么些字符数组开展完全遍历,常常状态下大家会只遍历二分之一

public static string Reverse(string name)
{
   if (String.IsNullOrEmpty(name))
   {
      throw new Exception("字符串不能够为空!"卡塔尔(قطر‎;
   }
  char[] nm = name.ToCharArray();
  for (int i = 0; i < (nm.Length-1 )/ 2; i++)
  {
     char q = nm[i];
     nm[i]= nm[nm.Length - 1 - i];
    nm[nm.Length - 1 - i] = q;
  }

1 :  00:00:05.7812500
21:  00:00:07.4218750
22:  00:00:08.2500000
3 :  00:00:50.3593750

public static string ReverseByCharBuffer2(string original)
{
char[] c = original.ToCharArray();
int l = original.Length;
for (int i = 0; i < l / 2; i++)
{
char t = c[i];
c[i] = c[l - i - 1];
c[l - i - 1] = t;
}
return new string(c);
}

  return new string(nm);

附1:Array.Revease(卡塔尔(قطر‎方法的源码(由Reflector.exe反汇编获得卡塔尔(قطر‎:

ReverseByCharBuffer使用了二个新的数组,何况遍历了字符数组的兼具因素,因而时间和空中的支付都要高于ReverseByCharBuffer2。

}

图片 94[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
图片 95public static void Reverse(Array array)
图片 96图片 97...{
图片 98      if (array == null)
图片 99图片 100      ...{
图片 101            throw new ArgumentNullException("array");
图片 102      }
图片 103      Array.Reverse(array, array.GetLowerBound(0), array.Length);
图片 104}
图片 105
图片 106[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
图片 107public static void Reverse(Array array, int index, int length)
图片 108图片 109...{
图片 110      int num1;
图片 111      int num2;
图片 112      if (array == null)
图片 113图片 114      ...{
图片 115            throw new ArgumentNullException("array");
图片 116      }
图片 117      if ((index < array.GetLowerBound(0)) || (length < 0))
图片 118图片 119      ...{
图片 120            throw new ArgumentOutOfRangeException((index < 0) ? "index" : "length", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
图片 121      }
图片 122      if ((array.Length - (index - array.GetLowerBound(0))) < length)
图片 123图片 124      ...{
图片 125            throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
图片 126      }
图片 127      if (array.Rank != 1)
图片 128图片 129      ...{
图片 130            throw new RankException(Environment.GetResourceString("Rank_MultiDimNotSupported"));
图片 131      }
图片 132      if (!Array.TrySZReverse(array, index, length))
图片 133图片 134      ...{
图片 135            num1 = index;
图片 136            num2 = (index + length) - 1;
图片 137            object[] objArray1 = array as object[];
图片 138            if (objArray1 == null)
图片 139图片 140            ...{
图片 141                  goto Label_00DE;
图片 142            }
图片 143            while (num1 < num2)
图片 144图片 145            ...{
图片 146                  object obj1 = objArray1[num1];
图片 147                  objArray1[num1] = objArray1[num2];
图片 148                  objArray1[num2] = obj1;
图片 149                  num1++;
图片 150                  num2--;
图片 151            }
图片 152      }
图片 153      return;
图片 154Label_00DE:
图片 155      if (num1 >= num2)
图片 156图片 157      ...{
图片 158            return;
图片 159      }
图片 160      object obj2 = array.GetValue(num1);
图片 161      array.SetValue(array.GetValue(num2), num1);
图片 162      array.SetValue(obj2, num2);
图片 163      num1++;
图片 164      num2--;
图片 165      goto Label_00DE;
图片 166}

在Array.Reverse内部,调用了非托管方法TrySZReverse,如若TrySZReverse不成事,实际上也是调用了看似ReverseByCharBuffer2的方法。

 

附2:StringBuilder.Append(卡塔尔国方法的源码(由Reflector.exe反汇编得到卡塔尔(قطر‎:

if (!TrySZReverse(array, index, length))
{
int num = index;
int num2 = (index + length) - 1;
object[] objArray = array as object[];
if (objArray == null)
{
while (num < num2)
{
object obj3 = array.GetValue(num);
array.SetValue(array.GetValue(num2), num);
array.SetValue(obj3, num2);
num++;
num2--;
}
}
else
{
while (num < num2)
{
object obj2 = objArray[num];
objArray[num] = objArray[num2];
objArray[num2] = obj2;
num++;
num2--;
}
}
}