算法题:反转数组

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

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

相关推荐
智者知已应修善业6 小时前
【求中位数】2024-1-23
c语言·c++·经验分享·笔记·算法
地平线开发者7 小时前
PTQ 量化数值范围与优化
算法·自动驾驶
sali-tec7 小时前
C# 基于halcon的视觉工作流-章68 深度学习-对象检测
开发语言·算法·计算机视觉·重构·c#
测试人社区-小明7 小时前
智能弹性伸缩算法在测试环境中的实践与验证
人工智能·测试工具·算法·机器学习·金融·机器人·量子计算
罗西的思考8 小时前
【Agent】MemOS 源码笔记---(5)---记忆分类
人工智能·深度学习·算法
qq_4335545411 小时前
C++数位DP
c++·算法·图论
AshinGau11 小时前
Softmax 与 交叉熵损失
神经网络·算法
似水এ᭄往昔11 小时前
【C++】--AVL树的认识和实现
开发语言·数据结构·c++·算法·stl
栀秋66611 小时前
“无重复字符的最长子串”:从O(n²)哈希优化到滑动窗口封神,再到DP降维打击!
前端·javascript·算法
xhxxx11 小时前
不用 Set,只用两个布尔值:如何用标志位将矩阵置零的空间复杂度压到 O(1)
javascript·算法·面试