408 King's Road Data Structure放課後演習(1)

一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して5日目です。クリックしてイベントの詳細をご覧ください

新しいピットを開き、23Wangdaoデータ構造のすべての放課後コード演習の実装を更新することを計画します。

試験は一般的に擬似コードで書かれていますが、強迫性障害のためにすべて実施しました。倉庫はこちらです。

シーケンステーブルの構造

テストは直接使用され、通常は構造を記述できません

#define MaxSize 50

typedef struct {
  ElemType data[MaxSize];
  int length;
}SqList; 
复制代码

2.2.3、1

image-20220407205709565.png

  • 暴力的な解決策は一般的にサイクルです。サイクルが1回失敗すると、2回発生し、2回失敗すると、3回繰り返されます...
  • 時間計算量O(n)、空間計算量O(1)
int del_min(SqList &list) {
  if (list.length == 0) {
    cout << "Error!" << endl;
    return -1;
  }

  // 1.假设0号元素最小
  int min = list.data[0]; 
  int pos = 0;

  // 2.循环找出最小元素并记录位置, 从1开始
  for (int i = 1; i < list.length; i++) {
    if (list.data[i] < min) {
      min = list.data[i];
      pos = i;
    }
  }

  // 3.删除最小元素并用最后一个元素替换
  list.data[pos] = list.data[list.length - 1];
  list.length--; 

  return min;
}
复制代码

2.2.3、2

image-20220407205615856.png

  • 暴力は別の配列全体であり、元の配列は最後からトラバースされ、新しい配列に配置されます
  • スペースの複雑さがO(1)の場合、最初から中央までループし、ヘッド要素とテール要素を交換します
  • 偶数または奇数の要素、すべて中央にループします< length/2。長さが4または5の場合、下付き文字が1のときにループが停止し、5の場合、中央の要素(下付き文字2)を移動する必要がないためです。 。
  • 時間計算量O(n)
void reverse(SqList &list) {
  for (int i = 0; i < list.length / 2; i++) {
    // 不让用swap()的话,可以定义一个辅助变量来交换
    swap(list.data[i], list.data[list.length - 1 - i]);
  }
}
复制代码

2.2.3、3

image-20220407232103579.png

  • 暴力とは、別の配列を完成させ、ループして、xに等しくないすべての要素を新しい配列に配置することです。
  • 時間計算量O(n)、空間計算量O(1)は、解くために1つのループを必要とします
  • xに等しいすべての要素を最後までスローしてから、長さを減算します
  • 逆:つまり、xに等しくないすべての要素を前に投げ、当然xに等しい要素は後ろに置きます。
void del_x(SqList &list, int x) {
  int k = 0;
  for (int i = 0 ; i < list.length ; i++) {
    // 1.把所有要保存的值都放在前面
    if (list.data[i] != x) {
      list.data[k++] = list.data[i];
    }
  }
  // 2.直接扔掉后面的元素
  list.length = k;
}
复制代码
  • 1つのループ->ダブルポインタ
  • クイックソートと同様に、両端から中央に移動し、左側のxを右側の非xと交換します
// 太麻烦了,不如上一个方法
void del_x_2(SqList &list, int x) {
  int i = -1, j = list.length, k = 0;
  while (i < j) {
    while (list.data[++i] != x); 
    while (list.data[--j] == x) k++;
    if (i < j) {
      swap(list.data[i], list.data[j]);
      k++;
    }
  }
  list.length -= k;
}
复制代码

おすすめ

転載: juejin.im/post/7083890571294539789