将数组a中数据元素实现就地逆置的算法

简介: 给出将整型数组a中数据元素实现就地逆置的算法。所谓就地逆置,就是利用数组a原有空间来存放数组a中逆序排放后的各个数据元素。

一、题目:



给出将整型数组a中数据元素实现就地逆置的算法。所谓就地逆置,就是利用数组a原有空间来存放数组a中逆序排放后的各个数据元素。


二、题目分析:



就是有一个整型的数组,将他的顺序进行倒置,且还是用原数组的地址空间进行存储,不可以改变他的数组的地址。


三、解决方法



算法追求的就是利用更小的空间更短的时间来解决问题。下面先说下很容易就可以想到的一种解决方案。


1.方式一


/**
 * 思路:使用一个数组做中间变量,存储倒叙的a数组
 * @param a
 * @return
 */
public static int[] getReverseArray(int[] a){
    int[] b = new int[a.length];
    for(int i=0;i<a.length;i++){
        b[b.length-1-i] = a[i];
    }
    for(int i=0;i<a.length;i++){
        a[i]=b[i];
    }
    return a;
}


2.方式二


上面的方案,会有一个中间数组,且需要两次的循环,这无疑在空间和时间上都不是一个优秀的解决方案,更不是一个好的算法。其实我们可以使用这种方式来解决。

/**
    * 思路:逆置,那就交换首尾的元素。
    * @param a
    * @return
    */
   public static int[] getReverseArrayTwo(int[] a){
       int tem = 0;
       for(int i=0;i<a.length;i++){
           if(i<a.length-1-i){
               tem = a[i];
               a[i] = a[a.length-1-i];
               a[a.length-1-i]=tem;
           }
       }
       return a;
   }


这种方案,就是直接交换收尾的元素即可实现该功能,无需对中间数组,也无需多次循环,此外需要注意,我们需要控制交换的次数,很明显我们需要交换一半的次数就行,稍微分析便可以知道,中间值的下标最大也会小于a.length/2,所以使用该值控制交换的次数。此种方案,在时间和空间上无疑都是较优秀的一种。


3.方式三


方式二已经是一种较为优秀的解决方案了,但是他仍然不是一种最优的解决方案,因为在实现的过程中仍然可能会有多余的交换,而且方式二中的判断交换次数其实可以使用其他方案进行解决,如下代码才是比较完美的解决方案。


//方式三
/**
 * 思路:通过对方式二的修改得来,无需控制次数,知道数组的长度,知道起始下标,那么我们就可以
 *       正续倒续一起查找,然后交换,这样当查找到同样的元素就代表已经交换完了。
 * @param a
 * @return
 */
public static int[] getReverseArrayThree(int[] a){
    int tem = 0;
    for(int i=0,j=a.length-1;i<j;i++,j--){
        tem = a[i];
        a[i] = a[j];
        a[j] = tem;
    }
    return a;
}


四、总结



这是笔者在看书时碰到的一个题目,前两种是笔者自己想出来的解决方案,最后一种则是参考了数上的思路写出来的。很明显书上给出的答案是最优的一种,这里总结并记录下。若是路过得你,有更好的解决方案,还希望不吝赐教。



相关文章
|
7天前
|
存储 算法 Go
算法学习:数组 vs 链表
算法学习:数组 vs 链表
13 0
|
5天前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
22 6
|
4天前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
12 1
|
7天前
|
机器学习/深度学习 算法 Python
机器学习算法的比较与选择是在实际应用中非常重要的一步,不同的算法适用于不同的问题和数据特征。
机器学习算法的比较与选择是在实际应用中非常重要的一步,不同的算法适用于不同的问题和数据特征。
|
12天前
|
机器学习/深度学习 数据采集 算法
机器学习入门:算法与数据的探索之旅
【6月更文挑战第13天】本文介绍了机器学习的基础,包括算法和数据处理的重要性。机器学习算法分为监督学习(如线性回归、决策树)、非监督学习(如聚类、降维)和强化学习。数据处理涉及数据清洗、特征工程、数据分割及标准化,是保证模型性能的关键。对于初学者,建议学习基础数学、动手实践、阅读经典资料和参与在线课程与社区讨论。
|
11天前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
4天前
|
算法
【洛谷 P1003】[NOIP2011 提高组] 铺地毯 题解(数组+贪心算法)
**NOIP2011 提高组问题:铺地毯** 在第一象限的颁奖典礼场地,有$n$张地毯按编号顺序铺设。需找出覆盖特定点$(x, y)$的最上方地毯编号。输入包括地毯坐标和点坐标,输出地毯编号或-1表示未覆盖。 样例:给定3张地毯,点$(2,2)$被第3张地毯覆盖,输出3;另一样例点$(4,5)$未被覆盖,输出-1。 $30\%$数据$n\leq2$,$50\%$数据坐标$\leq100$,$100\%$数据$n\leq10^4$,坐标$\leq10^5$。 解决方法:从下到上遍历地毯,更新覆盖点的地毯编号。 AC代码略。
5 0
|
11天前
|
机器学习/深度学习 算法
m基于PSO-GRU粒子群优化长门控循环单元网络的电力负荷数据预测算法matlab仿真
摘要: 在MATLAB 2022a中,对比了电力负荷预测算法优化前后的效果。优化前为&quot;Ttttttt111222&quot;,优化后为&quot;Tttttttt333444&quot;,明显改进体现为&quot;Tttttttttt5555&quot;。该算法结合了粒子群优化(PSO)和长门控循环单元(GRU)网络,利用PSO优化GRU的超参数,提升预测准确性和稳定性。PSO模仿鸟群行为寻找最优解,而GRU通过更新门和重置门处理长期依赖问题。核心MATLAB程序展示了训练和预测过程,包括使用&#39;adam&#39;优化器和超参数调整,最终评估并保存预测结果。
17 0
|
11天前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
|
1天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。

热门文章

最新文章