Quickest Method to Reverse in String in C#.net

前端 未结 11 1891
庸人自扰
庸人自扰 2021-02-02 18:17

I\'m currently writing a quick solution for Euler Problem #4 where one must find the largest palindromic number from the product of two 3-digit numbers.

To identify if a

相关标签:
11条回答
  • 2021-02-02 18:41
    string test = "ABC";
    string reversed = new String(test.ToCharArray().Reverse().ToArray());
    
    0 讨论(0)
  • 2021-02-02 18:42

    The Stopwatch class needs reset after each run. the code below has been corrected

    var d = s.ToCharArray();
    Array.Reverse(d);
    return s == new string(d);
    

    using System;
    using System.Diagnostics;
    
    namespace longeststring_codegolf
    {
        class Program
        {
            static void Main(string[] args)
            {
                int t = 0, v = 0;
                var sw = new Stopwatch();
    
                sw.Start();
                for (int i = 999; i > 99; i--)
                    for (int j = 999; j > 99; j--)
                        if ((v = i * j) > t && IsPalindromicMine(v.ToString()))
                            t = v;
                sw.Stop();
    
                var elapsed = sw.Elapsed;
                var elapsedMilliseconds = sw.ElapsedMilliseconds;
                var elapsedTicks = sw.ElapsedTicks; 
                Console.WriteLine("Ticks: " + elapsedTicks.ToString());//~189000
                Console.WriteLine("Milliseconds: " + elapsedMilliseconds.ToString()); //~9
    
                sw = Stopwatch.StartNew();
                for (int i = 999; i > 99; i--)
                    for (int j = 999; j > 99; j--)
                        if ((v = i * j) > t && IsPalindromic(v.ToString()))
                            t = v;
                sw.Stop();
                var elapsed2 = sw.Elapsed;
                var elapsedMilliseconds2 = sw.ElapsedMilliseconds;
                var elapsedTicks2 = sw.ElapsedTicks; 
                Console.WriteLine("Ticks: " + elapsedTicks2.ToString());//~388000
                Console.WriteLine("Milliseconds: " + elapsedMilliseconds2.ToString());//~20
    
            }
    
            static bool IsPalindromicMine(string s)
            {
                var d = s.ToCharArray();
                Array.Reverse(d);
                return s == new string(d);
            }
    
            static bool IsPalindromic(string s)
            {
                int len = s.Length;
                int half = len-- >> 1;
                for (int i = 0; i < half; i++)
                    if (s[i] != s[len - i])
                        return false;
                return true;
            }
    
        }
    }
    
    0 讨论(0)
  • 2021-02-02 18:46
    public static String Reverse(string input) {
      var length = input.Length;
      var buffer = new char[length];
      for ( var i= 0; i < input.Length; i++ ) {
        buffer[i] = input[(length-i)-1];
      }
      return new String(buffer);
    }
    

    EDIT: Doh! Forgot to halve the length for perf :)

    0 讨论(0)
  • 2021-02-02 18:46

    The fastest way I have found to reverse a string in C# is with the following code. It's faster reading in 32bits at a time instead of a char's length of 16bits. In debug mode, it is faster until you get to about 93 characters. Anything longer than that Array.Reverse() is faster. Using a release build and running outside of the IDE, this method will blow Array.Reverse() out of the water at any string length.

    char[] MyCharArray = MyString.ToCharArray();
    UIntStringReverse(ref MyCharArray);     //Code to reverse is below.
    string ReversedString = new string(MyCharArray);
    
    
    private static unsafe void UIntStringReverse(ref char[] arr)
    {
        uint Temp;
        uint Temp2;
    
        fixed (char* arrPtr = &arr[0])
        {
            uint* p, q;
            p = (uint*)(arrPtr);
            q = (uint*)(arrPtr + arr.LongLength - 2);
    
            if (arr.LongLength == 2)
            {
                Temp = *p;
                *p = ((Temp & 0xFFFF0000) >> 16) | ((Temp & 0x0000FFFF) << 16); 
                return;
            }
    
            while (p < q)
            {
                Temp = *p;
                Temp2 = *q;
    
                *p = ((Temp2 & 0xFFFF0000) >> 16) | ((Temp2 & 0x0000FFFF) << 16); 
                *q = ((Temp & 0xFFFF0000) >> 16) | ((Temp & 0x0000FFFF) << 16);
    
                p++;
                q--;
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-02 18:46

    Using ggf31416's FastReverse function, here is the solution to Project Euler's Problem #4 which completes on my computer in 47ms.

    using System;
    using System.Diagnostics;
    
    namespace Euler_Problem_4
    {
        class Program
        {
            static void Main(string[] args)
            {
                Stopwatch s = new Stopwatch();
                s.Start();
    
                int t = 0;
    
                for (int i = 999; i > 99; i--)
                {
                    for (int j = i; j > 99; j--)
                    {
                        if (i*j == FastReverse(i*j))
                        {
                            if (i * j > t)
                            {
                                t = i * j;
                            }
                        }
                    }
                }
    
                Console.WriteLine(t);
    
                s.Stop();
                Console.WriteLine("{0}mins {1}secs {2}ms", s.Elapsed.Minutes, s.Elapsed.Seconds, s.Elapsed.Milliseconds);
                Console.ReadKey(true);
    
            }
    
            private static int FastReverse(int num)
            {
                int res = 0;
                int q = (int)((214748365L * num) >> 31);
                int rm = num - 10 * q;
                num = q;
                if (rm == 0) return -1;
                res = res * 10 + rm;
                while (num > 0)
                {
                    q = (int)((214748365L * num) >> 31);
                    rm = num - 10 * q;
                    num = q;
                    res = res * 10 + rm;
                }
                return res;
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-02 18:48

    Performance: Fastest string reversing algorithms... (final results)

    0 讨论(0)
提交回复
热议问题