美文网首页
两个线性表在同一数组的位置交换操作——反复横跳

两个线性表在同一数组的位置交换操作——反复横跳

作者: Merborn | 来源:发表于2019-07-29 16:14 被阅读0次

题目

假设现在有一个array[m+n]数组,前m个为a线性表,后n个为b线性表,在空间复杂度为o(1)的情况下,完成2个数组位置的交换。

分析

题目看起来不难,我一开始的思路是malloc一块相同大小的数组,再将2个表的顺序颠倒即可实现,但是空间复杂度为o(1)的情况下(也就是所使用的空间不与array[]数组的长度产生关系),想要实现,确实需要巧妙的方法

解法思路

Step 1 初始状态

       0              1              2               3               4
+--------------+--------------+--------------+--------------+--------------+
|       a      |        b     |      c       |      d       |        e     |
+--------------+--------------+--------------+--------------+--------------+
|<-                   a表                  ->|<-             b表         ->|

Step2 让a表逆序

       0              1              2               3               4
+--------------+--------------+--------------+--------------+--------------+
|       c      |        b     |      a       |      d       |        e     |
+--------------+--------------+--------------+--------------+--------------+
|<-                   a表                  ->|<-             b表         ->|

Step3 让b表逆序

       0              1              2               3               4
+--------------+--------------+--------------+--------------+--------------+
|       c      |        b     |      a       |      e       |        d     |
+--------------+--------------+--------------+--------------+--------------+
|<-                   a表                  ->|<-             b表         ->|

Step4 让整个表逆序

       0              1              2               3               4
+--------------+--------------+--------------+--------------+--------------+
|       d      |        e     |      a       |      b       |        c     |
+--------------+--------------+--------------+--------------+--------------+
|<-           b表           ->|<-                   a表                   ->|

实现代码

编译环境为windows,mingw64,vs系列可能会出现像for循环变量书写错误,变量没有声明在最前等报错,请适当修改,谢谢。也希望有更多写法的朋友在评论里给出代码一起讨论

#include <stdio.h>
#include <malloc.h>
/*
 * 用于打印数组,可忽略
 */
void print_array(int a[], int len) {
    for (int i = 0; i < len; i++) {
        printf("%4d", a[i]);
        if (i != 0 && i % 10 + 1 == 0 )printf("\n");
    }
    printf("\n ");
}

/*
 *   !核心代码    执行数组的逆序操作
 */
int reverse(int start, int end, int a[]) {  //需要数组的  起点下标   
                                            //和 结束下标 (注意是下标!!)
    int mid = (end - start + 1) / 2;
    int temp = 0;
    for (int i = 0; i < mid; i++) {
        temp = a[start + i];
        a[start + i] = a[end - i];
        a[end - i] = temp;
    }

}

/*
 * 核心代码 整个操作的交换
 */
int totalReverse(int m, int n, int a[]) {

    reverse(0, m - 1, a);  //先逆序a线性表,也就是逆序从 0 号位 到 m-1 号位
    reverse(m, m + n - 1, a);    //再逆序b线性表,从m 号位到 m+n-1 号位
    reverse(0, m + n - 1, a); //整个数组再逆序一遍,即可完成 两个线性表位置交换的操作

}


int main() {
    int len = 50;   //数组的长度为50
    int *a = malloc(sizeof(int) * len);
    for (int i = 0; i < len; i++) {
        a[i] = i;
    }

    totalReverse(20,30,a);

    print_array(a, len);
    return 0;
}


相关文章

  • 两个线性表在同一数组的位置交换操作——反复横跳

    题目 假设现在有一个array[m+n]数组,前m个为a线性表,后n个为b线性表,在空间复杂度为o(1)的情况下,...

  • 在大雨中反复横跳

    早上起来,下楼去上班,外面竟然下起了雨,意识里,家里是没有伞的,感觉距离上班的单位不远,于是决定冒雨前行。 ...

  • 线性表之顺序存储结构

    线性表几种基本操作的思路1、插入算法:1)插入位置不合理,抛出异常2)线性表长度超过(>=)数组长度,抛出异常或者...

  • 反复横跳记

    阴 小雨 这两个月以来,我的心情总是在开心与不开心之间徘徊,渐渐的有了一定的抗性。 我一月二十一日回到河南,其实那...

  • 数组逆序

    数组逆序: 数组中的元素进行,位置上的交换 逆序实现思想:数组最远端位置交换 数组的指针思想:就是数组的索引 大指...

  • (C++实现)经典排序算法

    1. 交换排序 根据数组中两个元素值的大小来交换两个元素在数组中的位置。 1.1 冒泡排序 1.1.1 基本思想:...

  • 2021-07-20

    情绪反复横跳

  • 在断更之间反复横跳

    又一次断更,在刚刚断更7天后,很幸运的是7天后,又一次启动了复活卡,万般幸运。 我们疫情解封,高三复课,幼儿园复课...

  • 冒泡排序

    将数组相邻的两个元素比较,将小的数和大的数交换位置,否则不交换

  • 利用sort实现数组顺序打乱

    //用 sort 实现数组顺序打乱 //此方法直接改变原数组 sort方法在接收到差值大于0时会交换两个数的位置....

网友评论

      本文标题:两个线性表在同一数组的位置交换操作——反复横跳

      本文链接:https://www.haomeiwen.com/subject/zhnbrctx.html