🥰蓝蓝计算机考研算法-day23顺序表回顾

117 阅读3分钟

Day13 2023/03/13

难度:简单

题目

32、描述:删除顺序表中最小的元素,由最后一个元素补充。

33、逆转顺序表中的元素

34、删除顺序表中为x的元素:

运行实例

  1. 删除最小元素

image.png

  1. 逆转顺序表中的元素

image.png

  1. 删除顺序表中为x的元素

image.png

思路


  1. 第一题按照题意,我们只需要遍历顺序表比较每个元素大小,找到最小元素的下标,然后用最后一个元素覆盖即可。
  2. 第二题,只需要每次交换头尾元素即可,交换到中间位置停止。
  3. 第三题,利用双指针法删除顺序表中值为x的元素,类似删除数组中某个指定值一样。

关键点


第三题和第一题,都不是真正意义上的删除某个元素,而是通过更新顺序表的长度,来实现的逻辑上的删除!!!(仔细点⭕)

算法实现


c++代码实现- 删除最小元素

#include <iostream>
using namespace std;

// 静态分配的方式定义顺序表结构体
#define MAXSIZE 100 // 最大长度
typedef struct {
  int data[MAXSIZE]; // 数据域
  int length;        // 当前顺序表长度
} SqList;

// 创建顺序表
bool CreateList(SqList &L, int n) {
  if (n > MAXSIZE) // 不能超过顺序表的的最大长度
    return false;
  for (int i = 0; i < n; i++) { // 输入n个元素的值
    cin >> L.data[i];
  }
  L.length = n; // 更新顺序表长度
  return true;
}

// 删除顺序表中最小的元素,由最后一个元素补充
bool DeleteMin(SqList &L) {
  if (L.length == 0) { // 如果顺序表为空,则返回false
    return false;
  }
  int minIndex = 0;                    // 记录最小元素的下标
  for (int i = 1; i < L.length; i++) { // 遍历顺序表,找到最小元素的下标
    if (L.data[i] < L.data[minIndex]) {
      minIndex = i;
    }
  }
  L.data[minIndex] = L.data[L.length - 1]; // 用最后一个元素覆盖最小元素
  L.length--;                              // 顺序表长度减1
  return true;
}

int main() {
  SqList L;
  int n;
  cout << "请输入顺序表的长度,不要超过最大长度:";
  cin >> n;
  cout << "请输入" << n << "个元素的值:";
  CreateList(L, n); // 创建顺序表
  DeleteMin(L);
  cout << "删除最小元素后的顺序表为:";
  for (int i = 0; i < L.length; i++) {
    cout << L.data[i] << " ";
  }
  cout << endl;
  return 0;
}

c++代码实现-逆转顺序表中的元素

// 逆转顺序表中的元素
void Reverse(SqList &L) {
  int temp;
  for (int i = 0; i < L.length / 2; i++) { // 只需要遍历一半的元素
    temp = L.data[i];                      // 交换元素
    L.data[i] = L.data[L.length - i - 1];
    L.data[L.length - i - 1] = temp;
  }
}

int main() {
  SqList L;
  int n;
  cout << "请输入顺序表的长度,不要超过最大长度:";
  cin >> n;
  cout << "请输入" << n << "个元素的值:";
  CreateList(L, n);
  Reverse(L);
  cout << "逆序后的顺序表为:";
  for (int i = 0; i < L.length; i++) {
    cout << L.data[i] << " ";
  }
  cout << endl;
  return 0;
}

c++代码实现-删除顺序表中为x的元素

// 删除顺序表中值为x的元素
bool DeleteX(SqList &L, int x) {
  if (L.length == 0) { // 如果顺序表为空,则返回false
    return false;
  }
  int k = 0;                           // 记录不等于x的元素个数
  for (int i = 0; i < L.length; i++) { // 遍历顺序表
    if (L.data[i] != x) { // 如果元素不等于x,则将其前移
      L.data[k] = L.data[i];
      k++;
    }
  }
  // 更新顺序表长度(可能有些x没有被删除,通过更新长度来实现的假删除)
  L.length = k;
  return true;
}

int main() {
  SqList L;
  int n;
  cout << "请输入顺序表的长度,不要超过最大长度:";
  cin >> n;
  cout << "请输入" << n << "个元素的值:";
  CreateList(L, n);
  cout << "请输入要删除元素的值:";
  int x;
  cin >> x;
  DeleteX(L, x);
  cout << "删除值为" << x << "的元素后的顺序表为:";
  for (int i = 0; i < L.length; i++) {
    cout << L.data[i] << " ";
  }
  cout << endl;
  return 0;
}
  1. 删除最小元素
  • 时间复杂度 O(n)O(n)--- 遍历整个顺序表,其中n为当前顺序表长度
  • 空间复杂度 O(1)O(1)--- 顺序表为必要空间,其次仅含常数级的辅助空间
  1. 逆转顺序表中的元素
  • 时间复杂度 O(n)O(n)--- 遍历一半的顺序表,其中n为当前顺序表长度
  • 空间复杂度 O(1)O(1)--- 顺序表为必要空间,其次仅含常数级的辅助空间
  1. 删除顺序表中为x的元素
  • 时间复杂度 O(n)O(n)--- 遍历整个顺序表,其中n为当前顺序表长度
  • 空间复杂度 O(1)O(1)--- 顺序表为必要空间,其次仅含常数级的辅助空间

总结

  • 上面代码实现中,重复部分(定义顺序表和创建顺序表),在第一题的代码中,需要上机运行的同学,看仔细了。(😮)
  • 今天的题目是对顺序表的一个回顾,三个问题都是基于顺序表的基本操作来实现的,其次,例如第三题和第二题都是之前做过类似的!!!总之今天的题解是一个很好的知识回顾(💪)