How to reverse a number as an integer and not as a string?

前端 未结 19 2028
名媛妹妹
名媛妹妹 2020-12-14 03:29

I came across a question \"How can one reverse a number as an integer and not as a string?\" Could anyone please help me to find out the answer? Reversal should reverse the

19条回答
  •  难免孤独
    2020-12-14 03:59

    Something like this?

    public int ReverseInt(int num)
    {
        int result=0;
        while (num>0) 
        {
           result = result*10 + num%10;
           num /= 10;
        }
        return result;
    }
    

    As a hackish one-liner (update: used Benjamin's comment to shorten it):

    num.ToString().Reverse().Aggregate(0, (b, x) => 10 * b + x - '0');
    

    A speedier one-and-a-quarter-liner:

    public static int ReverseOneLiner(int num)
    {
        for (int result=0;; result = result * 10 + num % 10, num /= 10) if(num==0) return result;
        return 42;
    }
    

    It's not a one-liner because I had to include return 42;. The C# compiler wouldn't let me compile because it thought that no code path returned a value.

    P.S. If you write code like this and a co-worker catches it, you deserve everything he/she does to you. Be warned!

    EDIT: I wondered about how much slower the LINQ one-liner is, so I used the following benchmark code:

    public static void Bench(Func myFunc, int repeat)
    {
        var R = new System.Random();
        var sw = System.Diagnostics.Stopwatch.StartNew();
        for (int i = 0; i < repeat; i++)
        {
            var ignore = myFunc(R.Next());
        }
        sw.Stop();
        Console.WriteLine("Operation took {0}ms", sw.ElapsedMilliseconds);
    }
    

    Result (10^6 random numbers in positive int32 range):

    While loop version:
    Operation took 279ms
    
    Linq aggregate:
    Operation took 984ms
    

提交回复
热议问题