算法题:反转数组

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

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()方法则适用于已经在使用列表结构的情况。自定义迭代方法通常不是首选,除非你有特殊的需求或想要练习算法设计。

相关推荐
NAGNIP7 小时前
一文搞懂树模型与集成模型
算法·面试
NAGNIP7 小时前
万字长文!一文搞懂监督学习中的分类模型!
算法·面试
技术狂人1687 小时前
工业大模型工程化部署实战!4 卡 L40S 高可用集群(动态资源调度 + 监控告警 + 国产化适配)
人工智能·算法·面试·职场和发展·vllm
D_FW7 小时前
数据结构第六章:图
数据结构·算法
a程序小傲8 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
自学不成才8 小时前
深度复盘:一次flutter应用基于内存取证的黑盒加密破解实录并完善算法推理助手
c++·python·算法·数据挖掘
June`9 小时前
全排列与子集算法精解
算法·leetcode·深度优先
徐先生 @_@|||9 小时前
Palantir Foundry 五层架构模型详解
开发语言·python·深度学习·算法·机器学习·架构
夏鹏今天学习了吗10 小时前
【LeetCode热题100(78/100)】爬楼梯
算法·leetcode·职场和发展