当前位置: 首页 > 编程语言 > C#

在C#.net中反转字符串的最快方法Share

时间:2023-04-10 13:01:19 C#

在C#.net中反转字符串的最快方法从两个3位数的乘积中找到。要确定一个数字是否是回文,您显然会将数字的倒数与原始数字进行比较。由于C#没有内置的String.Reverse()方法,反转字符串的最快方法是什么?我将在100,000,000次迭代的循环中测试所有建议的解决方案。谁提交最快的解决方案,谁就会得到正确答案。我将在C#.Net3.5控制台应用程序中测试该解决方案,我认为就地进行比较可能会更快。如果反转字符串,则必须:实例化一个新的字符串对象(或StringBuffer对象)将数据(反向)从第一个字符串复制到新字符串进行比较。如果执行比较,则只会执行最后一步。即便如此,您的比较只是字符串的一半(如果是奇数个字符,则为一半-0.5)。像下面这样的东西应该起作用:staticboolIsPalindromic(strings){intlen=s.Length;inthalf=len-->>1;for(inti=0;i编辑:虽然这回答了OP的问题,但是ggf31416和配置器提供的解决方案通过我的测试解决了OP的实际需求,速度提高了大约30%。配置器的解决方案比ggf31416快一点,如果您将其转换为静态方法并使用int而不是ulong(否则会慢得多)。顺便说一下,要解决OP提到的示例的问题(找到任意两个三位数的最大回文乘积),以下简单(可能是天真的)循环:for(inti=100;i在我的机器上产生以下结果:IsPalindromic(product.ToString())花费了0.3064174秒。ggf31416Reverse(product)==product花费了0.1933994秒。configuratorReverse(product)==产品耗时0.1872061秒。每个产品产生913*993=906609个正确结果。反转数字不是更快吗?//未经检查的代码,如果它甚至不能编译也不要杀了我。ulongReverse(ulongnumber){ulong结果=0;while(number>0){ulongdigit=number%10;结果=结果*10+数字;数/=10;}返回结果;如果您想将数字与其倒数进行比较,使用除法将数字倒数而不是将其转换为字符串可能会更快。我仍然需要测试它的速度。privatestaticintReverse(intnum){intres=0;while(num>0){intrm;num=Math.DivRem(num,10,outrm);res=res*10+rm;}返回资源;编辑:DivRem比计算机中的分区和模块快大约1%。如果最后一位为0,则退出速度优化:privatestaticintReverse(intnum){intres=0;内部室;num=Math.DivRem(num,10,outrm);//一些神奇的价值或返回假,见下文。如果(rm==0)返回-1;res=res*10+rm;while(num>0){num=Math.DivRem(num,10,outrm);res=res*10+rm;}返回资源;使方法返回bool比我计算机中循环中的bool稍慢,但我不明白为什么。请在您的计算机上进行测试。乘法和位移应该比除法快,但可能没有那么精确。编辑:使用long似乎足够精确。privatestaticintFastReverse(intnum){intres=0;intq=(int)((214748365L*num)>>31);intrm=num-10*q;数=q;如果(rm==0)返回-1;res=res*10+rm;while(num>0){q=(int)((214748365L*num)>>31);rm=num-10*q;数=q;res=res*10+rm;}返回资源;}(214748365L*num)>>31等于i/10到1,073,741,829,其中1/10给出107374182,乘法+二进制移位给出107374183。性能:最快的字符串反转算法...(最终结果)字符串测试="ABC";字符串反转=newString(test.ToCharArray().Reverse().ToArray());publicstaticStringReverse(stringinput){varlength=input.Length;varbuffer=newchar[长度];for(vari=0;iEDIT:Doh!忘记将长度减半perf:)我发现在C#中反转字符到字符串的最快方法是使用以下代码。一次读取比16位长的char更快。在调试模式下,它会更快,直到达到大约93个字符。任何比Array.Reverse()长的东西。使用发布版本并在IDE外部运行,此方法将以任何字符串长度将Array.Reverse()打得一团糟。char[]MyCharArray=MyString.ToCharArray();UIntStringReverse(参考MyCharArray);//要反转的代码如下。字符串ReversedString=新字符串(MyCharArray);privatestaticunsafevoidUIntStringReverse(refchar[]arr){uintTemp;uint温度2;fixed(char*arrPtr=&arr[0]){uint*p,q;p=(uint*)(arrPtr);q=(uint*)(arrPtr+arr.LongLength-2);如果(arr.LongLength==2){Temp=*p;*p=((温度&0xFFFF0000)>>16)|((温度&0x0000FFFF)>16)|((Temp2&0x0000FFFF)>16)|((Temp&0x0000FFFF)试试这个:http://weblogs.sqlteam.com/mladenp/archive/2006/03/19/9350.aspxstringReverse(strings){returnnewstring(s.ToCharArray().Reverse().ToArray());}使用ggf31416的FastReverse函数,它是ProjectEuler问题#4的解决方案,它在我的电脑上用了47毫秒完成。使用系统;使用系统诊断;namespaceEuler_Problem_4{classProgram{staticvoidMain(string[]args){秒表s=newStopwatch();s.开始();诠释t=0;for(inti=999;i>99;i--){for(intj=i;j>99;j--){if(i*j==FastReverse(i*j)){if(i*j>t){t=i*j;}}}}Console.WriteLine(t);s.停止();Console.WriteLine("{0}mins{1}secs{2}ms",s.Elapsed.Minutes,s.Elapsed.Seconds,s.Elapsed.Milliseconds);控制台.ReadKey(true);}privatestaticintFastReverse(intnum){intres=0;intq=(int)((214748365L*num)>>31);intrm=num-10*q;数=q;如果(rm==0)返回-1;res=res*10+rm;while(num>0){q=(int)((214748365L*num)>>31);rm=num-10*q;数=q;res=res*10+rm;}返回资源;}}}每次运行后,秒表类都需要重新设置。以下代码已更正以上为C#学习教程:C#.net中反转字符串最快的方法全部内容分享,如果对大家有用需要进一步了解C#学习教程,希望大家多多指教会更加注意---vard=s.ToCharArray();Array.Reverse(d);返回s==新字符串(d);使用系统;使用系统诊断;namespacelongeststring_codegolf{classProgram{staticvoidMain(string[]args){intt=0,v=0;varsw=new秒表();sw.开始();对于(inti=999;i>99;i--)for(intj=999;j>99;j--)if((v=i*j)>t&&IsPalindromicMine(v.ToString()))t=v;sw.停止();varelapsed=sw.Elapsed;varelapsedMilliseconds=sw.ElapsedMilliseconds;varelapsedTicks=sw.ElapsedTicks;Console.WriteLine("Ticks:"+elapsedTicks.ToString());//~189000Console.WriteLine("Milliseconds:"+elapsedMilliseconds.ToString());//~9sw=Stopwatch.StartNew();对于(inti=999;i>99;i--)for(intj=999;j>99;j--)if((v=i*j)>t&&IsPalindromic(v.ToString()))t=v;sw.停止();varelapsed2=sw.Elapsed;varelapsedMilliseconds2=sw.ElapsedM毫秒;varelapsedTicks2=sw.ElapsedTicks;Console.WriteLine("Ticks:"+elapsedTicks2.ToString());//~388000Console.WriteLine("Milliseconds:"+elapsedMilliseconds2.ToString());//~20}staticboolIsPalindromicMine(strings){vard=s.ToCharArray();Array.Reverse(d);返回s==新字符串(d);}staticboolIsPalindromic(strings){intlen=s.Length;inthalf=len-->>1;for(inti=0;i本文收集自网络,不代表立场,如涉及侵权,请点右联系管理员删除,如需转载请注明出处: