算法题:反转数组

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

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

相关推荐
金銀銅鐵2 小时前
[Python] 扩展欧几里得算法
python·数学·算法
To_OC5 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC1 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
05Kevin1 天前
lk每日冒险题--数据结构6.27
算法
To_OC2 天前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安2 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者2 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent