总时间限制: 1000ms 内存限制: 65535kB
描述
编写算法,在一个非递减有序的顺序表中删除所有值相等的多余的元素。要求时间复杂度为O(n),空间复杂度为O(1)。
输入
两行,第一行为数据元素的个数n,第二行为n个元素,n<=1000000
输出
删除多余元素后的数据序列
样例输入
10
-1 -1 1 2 2 3 3 3 4 5
样例输出
-1 1 2 3 4 5
ac代码
/*
@File : sqlist_extraElement_delete.cpp
@Time : 2020/03/19
@Contact : levarz@163.com
@Desc : 顺序有序表中删除多余元素
*/
#include <iostream>
#include <stdlib.h>
using namespace std;
#define LEN 1000010
//顺序表
typedef struct
{
int date[LEN]; //数据域
int len; //顺序表长度
}sqlist;
/**
* @brief Create a sqlist object
*
* @param list 指向需要创建的顺序表指针
* @param len 需要创建的顺序表长度
*/
void create_sqlist(sqlist *&list, int len);
/**
* @brief 删除非递减有序顺序表中多余元素
*
* @param lsit 指向需要删除元素的顺序表指针
*/
void delete_extral_elements(sqlist *&lsit);
/**
* @brief display list
*
* @param list 指向需要显示的顺序表指针
*/
void display(sqlist *&list);
int main(int argc, char const *argv[])
{
sqlist *list;
int n;
cin >>n;
create_sqlist(list,n);
delete_extral_elements(list);
display(list);
system("pause");
return 0;
}
void create_sqlist(sqlist *&list, int len)
{
list = (sqlist*)malloc(sizeof(sqlist));
for (int i = 0; i < len; i++) {
cin >>list->date[i];
}
list->len = len;
}
void delete_extral_elements(sqlist *&lsit)
{
int j = 0;
for (int i = 1; i < lsit->len; i++) {
if (lsit->date[j]!=lsit->date[i]) {
lsit->date[++j] = lsit->date[i]; //自身储存
lsit->date[j] = lsit->date[i]; //没有多余开辟空间
}
}
lsit->len = j+1;
}
void display(sqlist *&list)
{
for (int i = 0; i < list->len; i++) {
cout <<list->date[i] <<" ";
}
}