首页 > 代码库 > 一道面试题分享(数组反转排列)
一道面试题分享(数组反转排列)
题 目如下:一个数组求反转结果,不使用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
代码很简单和简洁,但我感觉里面透着些耍小聪明的意思,因为他迂回了。就我的性格,做事就是单刀直入的,实在不行了再行迂回战术。可能是性格的原因吧。所以我就考虑直接在循环上想办法这样才够优雅和智慧。(不是自已拍自已马屁,只是对代码优雅的不同定义而已,呵呵,勿拍砖)先来看看规律,数组长度是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(","); } } }
一道面试题分享(数组反转排列)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。