一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して5日目です。クリックしてイベントの詳細をご覧ください。
新しいピットを開き、23Wangdaoデータ構造のすべての放課後コード演習の実装を更新することを計画します。
試験は一般的に擬似コードで書かれていますが、強迫性障害のためにすべて実施しました。倉庫はこちらです。
シーケンステーブルの構造
テストは直接使用され、通常は構造を記述できません
#define MaxSize 50
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
复制代码
2.2.3、1
- 暴力的な解決策は一般的にサイクルです。サイクルが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
- 暴力は別の配列全体であり、元の配列は最後からトラバースされ、新しい配列に配置されます
- スペースの複雑さが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
- 暴力とは、別の配列を完成させ、ループして、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;
}
复制代码