要求时间复杂度为O(n)那么要求你所实现的算法只包含一层for循环,也就是说一需要在一轮扫描中完成删除所有的值为X的数据元素的操作,空间复杂度为O(1)要求你不能借助另一个数组来实现此算法
算法思路:用一个变量来记录当前已经扫描到的值为X的数据元素的个数,然后将当前的数据元素向前移动k个位置
代码实现步骤
1、定义顺序表
//定义顺序表
typedef struct {
int data[MAX];
int length;
}sqList;
2、实现InitList操作
//对顺序表进行初始化
void InitList(sqList& L) {
L.length = 0;
}
3、实现 listInsert操作
//向顺序表中的指定位置插入指定值
bool listInsert(sqList& L, int i, int e)
{
if (i<1 || i>L.length + 1)
return false;
for (int j = L.length; j >= i; j--)
{
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
}
4、算法实现
//删除顺序表中值为X的数据元素,要求算法性能要好,时间复杂度为O(n),空间复杂度为O(1)
void deleteX(sqList& L, int x)
{
int x_num = 0; //记录当前已经扫描到的顺序表中值等于x的数据元素个数
for (int i = 0; i < L.length; i++)
{
if (L.data[i] == x)
{
x_num++;
}
else
{
L.data[i - x_num] = L.data[i];
}
}
L.length = L.length - x_num;
}
5、代码测试
int main()
{
sqList L;
InitList(L);
listInsert(L, 1, 0);
listInsert(L, 2, 1);
listInsert(L, 3, 3);
listInsert(L, 4, 1);
listInsert(L, 5, 5);
listInsert(L, 6, 1);
listInsert(L, 7, 7);
listInsert(L, 8, 1);
listInsert(L, 9, 8);
printf("未删除前:\n");
for (int i = 0; i < L.length; i++)
{
printf("%d\t", L.data[i]);
}
deleteX(L, 1);
printf("\n删除后:\n");
for (int i = 0; i < L.length; i++)
{
printf("%d\t", L.data[i]);
}
}
6、测试结果
完整源代码
//删除顺序表表中值为X的数据元素,要求时间复杂度为O(n),空间复杂度为O(1)
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define MAX 100
//定义顺序表
typedef struct {
int data[MAX];
int length;
}sqList;
//对顺序表进行初始化
void InitList(sqList& L) {
L.length = 0;
}
//向顺序表中的指定位置插入指定值
bool listInsert(sqList& L, int i, int e)
{
if (i<1 || i>L.length + 1)
return false;
for (int j = L.length; j >= i; j--)
{
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
}
//删除顺序表中值为X的数据元素,要求算法性能要好,时间复杂度为O(n),空间复杂度为O(1)
void deleteX(sqList& L, int x)
{
int x_num = 0; //记录当前已经扫描到的顺序表中值等于x的数据元素个数
for (int i = 0; i < L.length; i++)
{
if (L.data[i] == x)
{
x_num++;
}
else
{
L.data[i - x_num] = L.data[i];
}
}
L.length = L.length - x_num;
}
int main()
{
sqList L;
InitList(L);
listInsert(L, 1, 0);
listInsert(L, 2, 1);
listInsert(L, 3, 3);
listInsert(L, 4, 1);
listInsert(L, 5, 5);
listInsert(L, 6, 1);
listInsert(L, 7, 7);
listInsert(L, 8, 1);
listInsert(L, 9, 8);
printf("未删除前:\n");
for (int i = 0; i < L.length; i++)
{
printf("%d\t", L.data[i]);
}
deleteX(L, 1);
printf("\n删除后:\n");
for (int i = 0; i < L.length; i++)
{
printf("%d\t", L.data[i]);
}
}