算法题:反转数组

总结反转整型或字符数组,我们可以归纳出以下几种常见的方法:

1. 双指针法

这是最直接且高效的方法之一,通过两个指针(或索引)分别从数组的两端开始,逐步向中间移动并交换两端的元素,直到两个指针相遇或交错。

代码示例(整型数组)

java 复制代码
public static void reverseArray(int[] arr) {
    int left = 0;
    int right = arr.length - 1;
    while (left < right) {
        int temp = arr[left];
        arr[left] = arr[right];
        arr[right] = temp;
        left++;
        right--;
    }
}

代码示例(字符数组)

与整型数组的代码几乎相同,只是数组类型从int[]变为了char[]

2. 递归法

递归法通过函数自身调用自身来解决问题,对于数组反转,可以设计递归函数,每次调用时都向数组中心靠近一步,直到不需要再交换元素为止。

代码示例(整型或字符数组通用)

java 复制代码
public static void reverseArrayRecursive(int[] arr, int start, int end) {
    if (start >= end) {
        return;
    }
    int temp = arr[start];
    arr[start] = arr[end];
    arr[end] = temp;
    reverseArrayRecursive(arr, start + 1, end - 1);
}

// 对于字符数组,只需将方法签名中的int[]改为char[]即可

3. 使用Collections类(针对列表)

虽然这不是直接针对数组的,但如果你正在使用ArrayList或其他List实现,并且不介意将数组转换为列表,那么可以使用Collections.reverse()方法来反转列表。

注意 :这种方法需要先将数组转换为列表(如ArrayList),因为Collections.reverse()不接受数组作为参数。

代码示例(将整型数组转换为ArrayList并反转)

java 复制代码
List<Integer> list = new ArrayList<>(Arrays.asList(arr));
Collections.reverse(list);
// 注意:此时list是反转后的列表,如果需要数组,则需要再次转换

对于字符数组,同样需要先转换为List<Character>(虽然不太常见),但通常不建议这样做,因为直接操作字符数组更为高效。

4. 自定义迭代(较少见)

虽然不常见,但你可以通过自定义迭代过程来反转数组,这通常涉及到更复杂的逻辑,并且效率可能不如双指针法。

总结

对于大多数情况,双指针法是反转数组的首选方法,因为它既简单又高效。递归法虽然优雅,但在处理大数据集时可能不如迭代法高效。使用Collections.reverse()方法则适用于已经在使用列表结构的情况。自定义迭代方法通常不是首选,除非你有特殊的需求或想要练习算法设计。

相关推荐
董董灿是个攻城狮4 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员11 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish11 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱12 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript