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

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

原始数组:

[1,11,4,2]

` 反转后的数组:

[2,4,11,1]

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

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

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

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

10/3=3
9/3=3

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

Java版本代码如下:

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));

    }

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

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2018-07-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏海天一树

图的深度优先搜索

图有两种最基本的搜索算法,一种是深度优先搜索,另一种是广度优先搜索。本节先介绍深度优先搜索。

11820
来自专栏Java 源码分析

八大排序算法

​ 八大排序算法是面试经常考到的,尤其是快排,希尔排序和归并也是经常会让写代码的题目,其实只要用一句话说明了他们的原理我们写起代码就没那么困难。 冒泡排序...

53230
来自专栏积累沉淀

必须掌握的八种排序(7-8)--归并排序,基数排序

7、归并排序 (1)基本排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后...

24150
来自专栏公众号_薛勤的博客

让你一看就懂的快速排序算法(Java)

你也许会被快速排序的文章弄得迷迷糊糊,其实大体上去看,快速排序就一步:找个数做基准数,把小于它的数移到它左边,把大于它的数移到它右边。这句话是核心。然后我们只需...

12320
来自专栏武军超python专栏

2018年8月23日python中列表的高级操作:列表推导式,列表生成器,列表迭代器

列表在我们平常的编程中经常会用到,多用于临时存储一些程序需要的数据, 向列表中添加数据时,有多种方式: 1.数据少的话直接定义列表中的数据 my1 = [...

17230
来自专栏Python爱好者

Java基础笔记05

17880
来自专栏Python数据科学

十大经典排序算法(Python代码实现)

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见...

38010
来自专栏编程

python学习第二天:python的函数、循环和条件、类

第一天学习了Python的基本操作,以及几种主要的容器类型,今天学习 ,这样才算对Python有一个大致的了解。今天的学习大纲如下: 三、函数 1、定义函数 四...

18360
来自专栏老九学堂

嘀 , 嘀嘀 ... 常用排序算法再总结

  这篇文章中再和小伙伴们来探讨一下常用的非比较排序算法:计数排序,基数排序,桶排序。在一定条件下,它们的时间复杂度可以达到O(n)。

13630
来自专栏GreenLeaves

JavaScript引用类型之Array数组的排序方法

数组中已经存在两个JavaScript给我们定义好的重排序的方法:reverse()和sort()方法,下面来简单分析下: 1、reverse()    用于反...

21860

扫码关注云+社区

领取腾讯云代金券