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

题 目如下:一个数组求反转结果,不使用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

 

转载于:https://www.cnblogs.com/shanBlog/p/4103880.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值