首页 > 代码库 > 一道面试题分享(数组反转排列)

一道面试题分享(数组反转排列)

题 目如下:一个数组求反转结果,不使用Reverse方法。

面试时没过,当时有点紧张,知道是与高中知识数列有关。后来又在网上恶补了一下,也在网上找到了一个解决方案。先贴下网上的解决方案。

 

class Program    {        static void Main(string[] args)        {           int[] ts=new[] {1,2,3,4,5,6,7};                     int[] ts2 = new int[ts.Length];           for (var i = 0; i < ts.Length; i++)           {               ts2[i]=ts[ts.Length-i-1];           }            for (var i = 0; i <  ts.Length; i++)                {                    Console.WriteLine("value:{0}", ts2[i]);                    Console.WriteLine(",");                }        }    }View Code
View Code

代码很简单和简洁,但我感觉里面透着些耍小聪明的意思,因为他迂回了。就我的性格,做事就是单刀直入的,实在不行了再行迂回战术。可能是性格的原因吧。所以我就考虑直接在循环上想办法这样才够优雅和智慧。(不是自已拍自已马屁,只是对代码优雅的不同定义而已,呵呵,勿拍砖)先来看看规律,数组长度是0,1,2,3,4,5,6,7,8,9....对应的循环是0,0,1,1,2,2,3,3,4,4。。。再观察下,就是奇偶的循环数是一样的。这样我们就会想到高中对于奇偶的通项公式。(-1)^n-1,然后再观察,会发现循环次数是为偶数的长度除以2,即 len/2.这样把奇数变成偶数除以2不就得了。奇数变偶数,一般就是奇数-1,然后,试一下,得出通项公式为 (n+((-1)^n-1)/2)/2这样把1代入得0,2代入得1,这就是我们要找的了。于是化简下公式得,2n+((-1)^n-1)/4,好了大功告成,下面是完整代码。

 class Program    {        static void Main(string[] args)        {           int[] ts=new[] {1,2,3,4,5,6,7};           var n = ts.Length;           var n1 = (2 * n + (Math.Pow((-1), n) - 1)) / 4;           Console.WriteLine("value:{0}\n\n", n1);           for (var i = 0; i < n1; i++)           {               int temp;               temp = ts[i];               ts[i] = ts[n - 1 - i];               ts[n - 1 - i] = temp;           }           for (var i = 0; i < n; i++)           {               Console.WriteLine("value:{0}", ts[i]);               Console.WriteLine(",");           }                  }    }
View Code

 

一道面试题分享(数组反转排列)