威尼斯人线上娱乐

字符串反转,不是很懂

30 3月 , 2019  

 

面是完成字符串反转的各个办法:

转自:

栈和队列_栈

数组 链表 树 适用于数据库应用中作多少记录
int[] a =new int[10];
a[1]=100;
int b=a[字符串反转,不是很懂。1];

方法一:

威尼斯人线上娱乐 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            }

 

栈和队列 1.平时情状作为程序员的工具来利用

        2.受限访问
        3.更加抽象(主要通过接口进行定义)

栈正是一组记录,表现格局为先进后出

public static string Reverse(string name)
{
     if (String.IsNullOrEmpty(name))
       {
           throw new Exception(“字符串不能够为空!”);
       }
    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方法

意味着栈的代码

public class StackX{
private long[] stackArray;
private int maxSize;
private int top;//指向最顶层的任务
public StackX(int s){
maxSize=s;
stackArray=new long[maxSize];
top=-1;//因为第二个放进去的数额应该放在数组的0里面,开端没有的话
就给-1
}
//添加数码,永远往上添加
public void push(long j){
stackArray[++top]=j;
}
//查看并删除
public long pop(){
return stackArray[top–];
}
//查看
public long peek(){
return stackArray[top];
}
public boolean isEmpty(){
return top==-1;//尽管top==-1则是空的,因为我们初叶设置的
}
public boolean isFull(){
return top==(maxSize-1);
}
}

Public class StackApp{
Public static void main(String[]args){
StackX theStack=new StackX(10);
theStack.push(20);
theStack.push(40);
theStack.push(60);
theStack.push(80);
while(theStack.isEmpty()){
long value=theStack.pop();
System.out.print(value+””);
}
System.out.println();
System.ut.println(“theStack.isEmpty=”+theStack.isEmpty());
}
}

 

威尼斯人线上娱乐 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方法

Java实例1:单词逆序

public class StackX {
private int maxSize;
private char[] stackArray;//栈数组
private int top;//指针
public StackX(int max) {
maxSize=max;
stackArray=new char[maxSize];
top=-1;//top初始的时候地方是0 所以=-1
}
public void push(char j) {
stackArray[++top]=j;//先让top递增七个再赋值
}
public char pop() {
return stackArray[top–];//弹出
}
public char peek() {
return stackArray[top];//查找
}
public boolean isEmpty() {
//栈是不是为空
return top==-1;
}
}

public class Reverser {
private String input;//通过构造函数字传送过来的input
private String output;
public Reverser(String in) {
input=in;
}
public String doRev() {//反转
int stackSize=input.length();
StackX theStack=new StackX(stackSize);//创制1个栈
for(int j=0;j<input.length();j++) {
char ch=input.charAt(j);//拿出来字符串中内定的字符
theStack.push(ch);
}
output=””;
while(!theStack.isEmpty()) {
char c=theStack.pop();
output=output+c;

    }
    return output;
}

}

import java.io.*;
public class ReverseApp {
public static void main(String[]args ) throws IOException{//抛出13分
String input,output;
while(true) {
System.out.println(“Enter a String:”);
System.out.flush();//刷新一下
input=getString();
if(input.equals(“”))break;
Reverser theReverser=new Reverser(input);
output=theReverser.doRev();
System.out.println(“Reversed:”+output);
StringBuilder sb=new StringBuilder(“中国”);
System.out.println(“StringBuilder reverse:”+sb.reverse());
}
}
public static String getString() throws IOException{
InputStreamReader isr=new
InputStreamReader(System.in);//输入流的读取器
BufferedReader br=new BufferedReader(isr);//带缓存的读取器
String s=br.readLine();
return s;
}
}

方法二:.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);
}

Java实例2:分隔符匹配

public class StackX {
private int maxSize;
private char[] stackArray;//栈数组
private int top;//指针
public StackX(int max) {
maxSize=max;
stackArray=new char[maxSize];
top=-1;//top早先的时候地点是0 所以=-1
}
public void push(char j) {
stackArray[++top]=j;//先让top递增三个再赋值
}
public char pop() {
return stackArray[top–];//弹出
}
public char peek() {
return stackArray[top];//查找
}
public boolean isEmpty() {
//栈是或不是为空
return top==-1;
}
}

public class BracketChecker {
private String input;
public BracketChecker(String in) {
input=in;
}
//写2个检查的方法
public void check() {
int stackSize=input.length();
StackX theStack=new StackX(stackSize);
//a{b(c[d]e)f} {([ ])}
for(int j=0;j<input.length();j++) {
char ch=input.charAt(j);
switch(ch) {
case ‘{‘:
case ‘(‘:
case ‘[‘:
theStack.push(ch);//放入栈里
break;
case ‘}’:
case ‘)’:
case ‘]’:
if(theStack.isEmpty()) {
char chx=theStack.pop();
if((ch==’}’&& chx!='{‘)||(ch==’]’&& chx!='[‘)||(ch==’)’&& chx!='(‘)
) {
System.out.println(“Error:”+ch+”at”+j);
}
}
else {
System.out.println(“Error:”+ch+”at”+j);
}
break;
default:
break;
}
}
if(!theStack.isEmpty())System.out.println(“Error:missing right
delimiter.”);
}
}

import java.io.*;

public class BracketApp {
public static void main(String[]args) throws IOException {
String input;
while(true) {
System.out.println(“Enter string containing delimiters:”);
System.out.flush();
input=getString();
if(input.equals(“”))break;
BracketChecker theChecker=new BracketChecker(input);
theChecker.check();
}
}
public static String getString() throws IOException{
InputStreamReader isr=new
InputStreamReader(System.in);//输入流的读取器
Buffered里德r br=new BufferedReader(isr);//带缓存的读取器
String s=br.readLine();
return s;
}
}

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

但还有个意料之外的难题,就是Debug版本中的Revease1()和Revease21()运转起来要比Release版本中的要快,而Revease22()和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–;
}
}
}

威尼斯人线上娱乐 167public StringBuilder Append(string value)
威尼斯人线上娱乐 168威尼斯人线上娱乐 169…{
威尼斯人线上娱乐 170      if (value != null)
威尼斯人线上娱乐 171威尼斯人线上娱乐 172      …{
威尼斯人线上娱乐 173            string text1 = this.m_StringValue;
威尼斯人线上娱乐 174            IntPtr ptr1 = Thread.InternalGetCurrentThread();
威尼斯人线上娱乐 175            if (this.m_currentThread != ptr1)
威尼斯人线上娱乐 176威尼斯人线上娱乐 177            …{
威尼斯人线上娱乐 178                  text1 = string.GetStringForStringBuilder(text1, text1.Capacity);
威尼斯人线上娱乐 179            }
威尼斯人线上娱乐 180            int num1 = text1.Length;
威尼斯人线上娱乐 181            int num2 = num1 + value.Length;
威尼斯人线上娱乐 182            if (this.NeedsAllocation(text1, num2))
威尼斯人线上娱乐 183威尼斯人线上娱乐 184            …{
威尼斯人线上娱乐 185                  string text2 = this.GetNewString(text1, num2);
威尼斯人线上娱乐 186                  text2.AppendInPlace(value, num1);
威尼斯人线上娱乐 187                  this.ReplaceString(ptr1, text2);
威尼斯人线上娱乐 188            }
威尼斯人线上娱乐 189            else
威尼斯人线上娱乐 190威尼斯人线上娱乐 191            …{
威尼斯人线上娱乐 192                  text1.AppendInPlace(value, num1);
威尼斯人线上娱乐 193                  this.ReplaceString(ptr1, text1);
威尼斯人线上娱乐 194            }
威尼斯人线上娱乐 195      }
威尼斯人线上娱乐 196      return this;
威尼斯人线上娱乐 197}
威尼斯人线上娱乐 198
威尼斯人线上娱乐 199private bool NeedsAllocation(string currentString, int requiredLength)
威尼斯人线上娱乐 200威尼斯人线上娱乐 201…{
威尼斯人线上娱乐 202      return (currentString.ArrayLength <= requiredLength);
威尼斯人线上娱乐 203
威尼斯人线上娱乐 204
威尼斯人线上娱乐 205internal unsafe void AppendInPlace(string value, int currentLength)
威尼斯人线上娱乐 206威尼斯人线上娱乐 207…{
威尼斯人线上娱乐 208      int num1 = value.Length;
威尼斯人线上娱乐 209      int num2 = currentLength + num1;
威尼斯人线上娱乐 210      fixed (char* chRef1 = &this.m_firstChar)
威尼斯人线上娱乐 211威尼斯人线上娱乐 212      …{
威尼斯人线上娱乐 213            fixed (char* chRef2 = &value.m_firstChar)
威尼斯人线上娱乐 214威尼斯人线上娱乐 215            …{
威尼斯人线上娱乐 216                  string.wstrcpy(chRef1 + currentLength, chRef2, num1);
威尼斯人线上娱乐 217            }
威尼斯人线上娱乐 218            chRef1[num2] = ‘

粗粗上作者能体会领会的算法正是那样多了,然则自身无意发现了StackOverflow上的一篇帖子,才发现那样一个好像简单的反转算法完结起来真可谓花样繁多。
3. 使用StringBuilder
选用StringBuilder方法大约和ReverseByCharBuffer一样,只可是不利用字符数组做缓存,而是利用StringBuilder。

 

public static string ReverseByStringBuilder(this string original)
{
StringBuilder sb = new StringBuilder(original.Length);
for (int i = original.Length – 1; i >= 0; i–)
{
sb.Append(original[i]);
}
return sb.ToString();
}

当然,你能够预知,那种算法的功用不会比ReverseByCharBuffer要高。

大家得以像使用字符缓存那样,对运用StringBuilder方法进行优化,使其遍历进程也回落50%

public static string ReverseByStringBuilder2(this string original)
{
StringBuilder sb = new StringBuilder(original);
for (int i = 0, j = original.Length – 1; i <= j; i++, j–)
{
sb[i] = original[j];
sb[j] = original[i];
}
return sb.ToString();
}

如上那两种艺术按算法角度来说,其实能够归咎为一类。然则下面包车型客车两种算法就完全不是同样类型的了。
使用栈

4.
栈是3个很神奇的数据结构。大家能够利用它后进先出的表征来对数组进行反转。先将数组全部因素压入栈,然后再取出,顺序很自然地就与原来相反了。

public static string ReverseByStack(this string original)
{
Stack<char> stack = new Stack<char>();
foreach (char ch in original)
{
stack.Push(ch);
}
char[] c = new char[original.Length];
for (int i = 0; i < original.Length; i++)
{
c[i] = stack.Pop();
}
return new string(c);
}

一遍巡回和栈的付出无疑使这种方法成为近日截止开支最大的点子。但运用栈那个数据结构的想法照旧要命有价值的。
使用XOR

5. 选取逻辑异或也足以举行反转

public static string ReverseByXor(string original)
{
char[] charArray = original.ToCharArray();
int l = original.Length – 1;
for (int i = 0; i < l; i++, l–)
{
charArray[i] ^= charArray[l];
charArray[l] ^= charArray[i];
charArray[i] ^= charArray[l];
}
return new string(charArray);
}

在C#中,x ^= y也正是x = x ^
y。通过贰回异或操作,能够将七个字符停止交流。对于算法具体的演讲能够参照那篇小说。
6. 接纳斯达克综合指数针

接纳斯达克综合指数针能够达到规定的标准最快的进程,然而unsafe代码不是微软所推荐的,在此处大家就不多做研商了

public static unsafe string ReverseByPointer(this string original)
{
fixed (char* pText = original)
{
char* pStart = pText;
char* pEnd = pText + original.Length – 1;
for (int i = original.Length / 2; i >= 0; i–)
{
char temp = *pStart;
*pStart++ = *pEnd;
*pEnd– = temp;
}

return original;
}
}

7. 行使递归

对此反转那类算法,都足以利用递归方法

public static string ReverseByRecursive(string original)
{
if (original.Length == 1)
return original;
else
return original.Substring(1).ReverseByRecursive() + original[0];
}

8. 应用委托,还足以使代码变得进一步简洁

public static string ReverseByRecursive2(this string original)
{
Func<string, string> f = null;
f = s => s.Length > 0 ? f(s.Substring(1)) + s[0] :
string.Empty;
return f(original);
}

然则委托开发大的坏处在那边好几也尚无滑坡,以至于自身做质量测试的时候导致系统假死甚至内部存款和储蓄器益处。
使用LINQ

9.
System.Enumerable里提供了暗中认可的Reverse扩充方法,我们得以依据该格局来对String类型进行扩充

public static string ReverseByLinq(this string original)
{
return new string(original.Reverse().ToArray());
}

10.透过char数组的不二法门遍历反转:

package string;

public class StringTest3 {
   public  static void main(String[] args)
   {
     String s="abcdefg";
       String s2="";
     char[] cs=s.toCharArray();
        for(int i=cs.length-1;i>=0;i--)
        {
         s2=s2+cs[i];
      }
     System.out.println("对字符串进行反转操作后为:"+s2);
       StringBuffer sb=new StringBuffer("abcdefg");
      StringBuffer sb2=sb.reverse();
        System.out.println("对StringBuffer进行反转操作后为:"+sb2);
  }

}


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图