• C语言练习百题之将一个数组逆序输出


    题目:将一个数组逆序输出

    程序分析

    要将一个数组逆序输出,可以使用多种方法。基本思路是将数组中的元素顺序颠倒过来,将第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,以此类推。

    方法1: 使用循环遍历实现

    思路

    1. 使用两个指针,一个指向数组的第一个元素,另一个指向数组的最后一个元素。
    2. 交换这两个指针所指向的元素。
    3. 将第一个指针向后移动,将最后一个指针向前移动。
    4. 重复步骤2和3,直到第一个指针不小于最后一个指针。
    5. 数组的元素顺序已经被逆序修改。

    代码

    #include 
    
    void reverseArray(int arr[], int length) {
        int start = 0;
        int end = length - 1;
    
        while (start < end) {
            // 交换数组中的元素
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
    
            start++;
            end--;
        }
    }
    
    int main() {
        int arr[] = {1, 2, 3, 4, 5};
        int length = sizeof(arr) / sizeof(arr[0]);
    
        reverseArray(arr, length);
    
        printf("逆序数组: ");
        for (int i = 0; i < length; i++) {
            printf("%d ", arr[i]);
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    优点

    • 不需要额外的内存空间,直接修改原数组。
    • 算法简单,空间复杂度低。

    缺点

    • 修改了原数组的顺序,可能不适用于需要保持原数组不变的情况。

    方法2: 使用递归实现

    思路

    1. 递归方法的基本情况是数组为空或只有一个元素,此时无需逆序操作,直接返回原数组。
    2. 对于其他情况,可以递归地将数组的子部分逆序,然后将第一个元素放在逆序后的数组的末尾。
    3. 递归终止条件是数组长度为0或1。

    代码

    #include 
    
    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);
    }
    
    void reverseArray(int arr[], int length) {
        reverseArrayRecursive(arr, 0, length - 1);
    }
    
    int main() {
        int arr[] = {1, 2, 3, 4, 5};
        int length = sizeof(arr) / sizeof(arr[0]);
    
        reverseArray(arr, length);
    
        printf("逆序数组: ");
        for (int i = 0; i < length; i++) {
            printf("%d ", arr[i]);
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    优点

    • 不需要额外的内存空间,直接修改原数组。
    • 使用递归,可以将问题分解为更小的子问题,增加代码的可读性。

    缺点

    • 递归方法可能导致栈溢出,对于非常大的数组不适用。
    • 递归方法在某些情况下可能不如迭代方法高效。

    方法3: 使用临时数组实现

    思路

    1. 创建一个与原数组相同大小的临时数组。
    2. 从原数组的末尾开始,逐个将元素复制到临时数组的开头。
    3. 最终得到的临时数组就是原数组的逆序。
    4. 将临时数组的元素复制回原数组。

    代码

    #include 
    
    void reverseArray(int arr[], int length) {
        int temp[length];
    
        // 从原数组的末尾开始,逐个复制到临时数组
        for (int i = length - 1, j = 0; i >= 0; i--, j++) {
            temp[j] = arr[i];
        }
    
        // 将临时数组的元素复制回原数组
        for (int i = 0; i < length; i++) {
            arr[i] = temp[i];
        }
    }
    
    int main() {
        int arr[] = {1, 2, 3, 4, 5};
        int length = sizeof(arr) / sizeof(arr[0]);
    
        reverseArray(arr, length);
    
        printf("逆序数组: ");
        for (int i = 0; i < length; i++) {
            printf("%d ", arr[i]);
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    优点

    • 不修改原数组的顺序,逆序操作在临时数组上完成。
    • 算法简单,易于理解。

    缺点

    • 需要额外的内存空间来存储临时数组。
    • 有两次数组元素的复制操作,可能会降低性能。

    总结和推荐

    • 方法1(修改原数组实现)通常是最好的选择,因为它不需要额外的内存空间,直接修改原数组,适用于大多数情况。
    • 方法2(使用递归实现)可以增加代码的可读性,但对于大数组可能会导致栈溢出,不太适用。只有在递归深度不会很大的情况下才建议使用。
    • 方法3(使用临时数组实现)可以保持原数组不变,但需要额外的内存空间,并且有两次数组元素的复制操作,可能会降低性能。

    总的来说,方法1是最推荐的,因为它既高效又简单,不需要额外的内存空间。方法2和方法3在某些情

    况下也是合理的选择,取决于是否需要保持原数组不变或是否需要递归的可读性。

  • 相关阅读:
    2024华为OD技术面真题-座位预约管理系统
    [BJDCTF2020]Cookie is so stable-1|SSTI注入
    Log4j “史诗级 ”漏洞背后:项目只有三位赞助者;RISC-V 基金会加速设计 RISC-V GPU;Linux 5.16 将延期发布 | 开源日报
    缓存存在的问题:缓存穿透、缓存击穿、缓存雪崩
    spring揭秘总结(一)——spring的Ioc容器
    Redis知识-基础篇
    DDPG算法
    Redis 内存满了怎么办?这样设置才正确!
    AI在日常生活中有哪些应用?
    Windows 磁盘管理时磁盘删除卷解决方法
  • 原文地址:https://blog.csdn.net/2302_79769289/article/details/133693849