顺序有序表中删除多余元素

Posted levarz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序有序表中删除多余元素相关的知识,希望对你有一定的参考价值。

总时间限制: 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] <<" ";
    } 
}**------------恢复内容开始------------**
总时间限制: 1000ms	内存限制: 65535kB 
#### **描述**

编写算法,在一个非递减有序的顺序表中删除所有值相等的多余的元素。要求时间复杂度为O(n),空间复杂度为O(1)。

#### **输入**
两行,第一行为数据元素的个数n,第二行为n个元素,n<=1000000

#### **输出**
删除多余元素后的数据序列

#### **样例输入**

>10<br>
>-1 -1 1 2 2 3 3 3 4 5

### **样例输出**

>-1 1 2 3 4 5

---
#### **ac代码**
```c++
@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] <<" ";
    } 
}
**------------恢复内容结束------------**

以上是关于顺序有序表中删除多余元素的主要内容,如果未能解决你的问题,请参考以下文章

顺序表应用1:多余元素删除之移位算法

顺序表应用2:多余元素删除之建表算法

顺序表算法题

顺序表应用2:多余元素删除之建表算法

C语言数据结构,在一个顺序表中删除所有元素值3的倍数的元素,求代码

删除重复元素