前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个优雅的反转数组的算法

一个优雅的反转数组的算法

作者头像
我是攻城师
发布2018-08-03 11:00:33
1K0
发布2018-08-03 11:00:33
举报
文章被收录于专栏:我是攻城师我是攻城师

反转数组指的是把一个倒置,如下:

原始数组:

代码语言:javascript
复制
[1,11,4,2]

` 反转后的数组:

代码语言:javascript
复制
[2,4,11,1]

` 比较简单粗暴的方法是,遍历原始数组从最后一项向前遍历,然后把输出结果保存在一个新的数组里面,这样就完成了所谓的反转。

虽然方法行的通,但性能却一般,更好的办法是通过交换实现,即第一项与最后一项交换,第二项与倒数第二项交换,依次类推,只需要遍历数组的一半的大小交换,就可以完成反转。这种思路有点类似于高斯求和的理论,只不过那里面是相加,我们这里是交换,其中:

遍历的次数=数组的长度/2

这里不分数组的长度是偶数还是奇数,如果是奇数那么中间的一位数是不需要交换的,如果是偶数则刚好对半交换,所以这里交换的次数总是等于(len/2),注意计算机算len/2都是舍一取整:

代码语言:javascript
复制
10/3=3
9/3=3

所以这里刚好就是交换的次数,利用这种方式完成交换比较简单优雅,同时不需要新生成数组空间,直接在原数组上改动即可。

Java版本代码如下:

代码语言:javascript
复制
static void reverseArray(){

        int array[]={1,2,5,4};
        System.out.println("原始数组:"+Arrays.toString(array));
        //数组的长度
        int n=array.length;
        //只需要循环长度的一半的次数即可完成反转
        for (int j = 0; j <n/2 ; j++) {
            int temp=array[j];//获取前半部分数组的每一个元素
            array[j]=array[n-1-j];//获取对应的后半部分数组的每一个元素
            array[n-1-j]=temp;//在原数组中完成前后交换
        }
        System.out.println("反转后的数组:"+Arrays.toString(array));

    }

了解这种思路之后,我们就可以举一反三,使用这种思想反转字符串,反转链表等等,本质上来说操作的都是数组,所以只要思路对,没有什么本质区别,如果你有更好的思路请一定告诉我。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档