顺序表元素的快速删除
作者: 冯向阳
时间限制: 1s
章节: 课程设计
问题描述
已知线性表A采用顺序存储结构,请设计一时间复杂度为0(n)、空间复杂度为0(1)的算法,该算法删除线性表中所有值为item的数据元素。要求:线性表元素个数n很大,而值为item的数据元素个数很少,要求移动元素个数尽量少;删除后的数组元素与原数组元素不必保持顺序一致。
提示:算法参照快速排序的思想,使用两个指针,分别从左往右扫描找到需要被删除的元素、从右往左扫描找到不被删除的元素,然后交换。然后继续扫描。
参考函数原型:
//删除线性表中所有值为item的数据元素,时间复杂度为0(n)、空间复杂度为0(1)
void DeleteItem( vector<string> &A, string item );
输入说明
第一行:顺序表A的数据元素(数据元素之间以空格分隔)
第二行:待删除数据元素
输出说明
第一行:删除后的顺序表长度
第二行:删除后的顺序表遍历结果(数据元素之间以逗号分隔)
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
void DeleteItem(vector<string>& A, string item) {
int left = 0;
int right = A.size() - 1;
while (left <= right) {
while (left <= right && A[left] != item) {
left++;
}
while (left <= right && A[right] == item) {
right--;
}
if (left < right) {
swap(A[left], A[right]);
left++;
right--;
}
}
A.resize(right + 1);
}
int main() {
string line, item;
vector<string> A;
// 读取顺序表A的数据元素
getline(cin, line);
stringstream ss(line);
while (ss >> item) {
A.push_back(item);
}
// 读取待删除数据元素
getline(cin, item);
// 删除指定元素
DeleteItem(A, item);
// 输出删除后的顺序表长度
cout << A.size() << endl;
// 输出删除后的顺序表遍历结果
for (size_t i = 0; i < A.size(); ++i) {
cout << A[i];
if (i < A.size() - 1) {
cout << ",";
}
}
cout << endl;
return 0;
}