当前位置: 首页 > news >正文

【王道数据结构-第二章-线性表算法题】

第二章-线性表算法题 笔记记录

  • 1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
  • 2. 设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
  • 3. 对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为 O(1)的算法,该算法删除顺序表中所有值为x的数据元素。
  • 4. 从顺序表中删除其值在给定值s和t之间(包含s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。
  • 5. 从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。

1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

#include <iostream>
#define MAXSIZE 5
typedef struct {int data[MAXSIZE];int length;
} SeqList;/**
* 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
* 解析:记录最小值和最小值位置然后进行置换就行*/
bool deleteMinElement(SeqList &seqList, int &value) {if (seqList.length == 0) {return false;}int pos = 0;int minValue = seqList.data[0];for (int i = 1; i < seqList.length; i++) {if (seqList.data[i] < minValue) {minValue = seqList.data[i];pos = i;}}seqList.data[pos] = seqList.data[seqList.length - 1];value=minValue;seqList.length--;return true;
}int main() {SeqList seqList;seqList.length = 5;srand((unsigned) time(NULL));for (int i = 0; i < seqList.length; i++) {seqList.data[i] = rand() % 100;printf("%d ", seqList.data[i]);}int value=0;//输出最小值if (deleteMinElement(seqList, value)) {printf("\n");for (int i = 0; i < seqList.length; i++) {printf("%d ", seqList.data[i]);}printf("\n");printf("最小值:%d", value);} else {printf("没有最小值\n");}return 0;
}

2. 设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。

#include <iostream>
#define MAXSIZE 5
typedef struct {int data[MAXSIZE];int length;
} SeqList;
/*** 计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。* 解析:就是对调元素位置*/
void invert(SeqList &seqList) {for (int i = 0; i < seqList.length / 2; i++) {int temp = seqList.data[i];seqList.data[i] = seqList.data[seqList.length - 1 - i];seqList.data[seqList.length - 1 - i] = temp;}
}int main() {SeqList seqList;seqList.length = 5;srand((unsigned) time(NULL));for (int i = 0; i < seqList.length; i++) {seqList.data[i] = rand() % 100;printf("%d ", seqList.data[i]);}invert(seqList);printf("\n");for (int i = 0; i < seqList.length; i++) {printf("%d ", seqList.data[i]);}return 0;
}

3. 对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为 O(1)的算法,该算法删除顺序表中所有值为x的数据元素。

#include <iostream>
#define MAXSIZE 5
typedef struct {int data[MAXSIZE];int length;
} SeqList;
/**
* 对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为 O(1)的算法,该算法删除顺序表中所有值为x的数据元素。
* 解析:相当于再来一个标记位,从头开始重新赋值不是x的元素到列表中*/
void deleteX(SeqList &seqList, int x) {int k = 0;for (int i = 0; i < seqList.length; i++) {if (seqList.data[i] != x) {seqList.data[k++] = seqList.data[i];}}seqList.length = k;
}/*** * @param seqList * @param x* 解析: 每次移动都记录k的个数,到下一个不是k元素时向前移动k个元素*/
void deleteX2(SeqList &seqList, int x) {int k = 0, i = 0;;while (i < seqList.length) {if (seqList.data[i] == x) {k++;} else {//当前元素不是x,将当前元素移动k个元素的距离seqList.data[i - k] = seqList.data[i];}i++;}seqList.length -= k;
}
int main() {SeqList seqList;seqList.length = 5;srand((unsigned) time(NULL));for (int i = 0; i < seqList.length; i++) {seqList.data[i] = rand() % 10;printf("%d ", seqList.data[i]);}deleteX(seqList, 5);printf("\n");for (int i = 0; i < seqList.length; i++) {printf("%d ", seqList.data[i]);}return 0;
}

4. 从顺序表中删除其值在给定值s和t之间(包含s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。

#include <iostream>
#define MAXSIZE 5typedef struct {int data[MAXSIZE];int length;
} SeqList;
/**
* 从顺序表中删除其值在给定值s和t之间(包含s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。
* 解析:与第3题类似,用k做标记为从头开始扫,仅把不需要删除的赋值到列表中*/
bool deleteRange(SeqList &seqList, int s, int t) {if (s >= t || seqList.length == 0) {return false;}int k = 0;for (int i = 0; i < seqList.length; i++) {if (seqList.data[i] < s || seqList.data[i] > t) {seqList.data[k++] = seqList.data[i];}}seqList.length = k;return true;
}/**** @param seqList* @param s* @param t* 解析:记录删除的个数,从第一个开始扫,遇到需要删除的元素,记录个数,否则赋值到列表中*/
bool deleteRange2(SeqList &seqList, int s, int t) {int k = 0, i = 0;if (s >= t || seqList.length == 0) {return false;}for (int i = 0; i < seqList.length; i++) {if (seqList.data[i] >= s && seqList.data[i] <= t) {k++;} else {seqList.data[i - k] = seqList.data[i];}}seqList.length -= k;return true;
}int main() {SeqList seqList;seqList.length = 5;srand((unsigned) time(NULL));for (int i = 0; i < seqList.length; i++) {seqList.data[i] = rand() % 10;printf("%d ", seqList.data[i]);}deleteRange(seqList, 2, 5);printf("\n");for (int i = 0; i < seqList.length; i++) {printf("%d ", seqList.data[i]);}return 0;
}

5. 从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。

#include <iostream>
#define MAXSIZE 50typedef struct {int data[MAXSIZE];int length;
} SeqList;/*** 5.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。* 解析:题目说有序的,所以用两个指针,一个指向当前元素,一个指向下一个元素,如果当前元素和下一个元素相等,则删除下一个元素,否则当前元素向后移动* 与第3题类似,用k做标记为从头开始扫,仅把不需要删除的赋值到列表中* 其次注意这里要先++,也就是++k因为我们默认第一个元素就是不重复列表的第一个所以遇到下一个要从第二个开始放置,所以是++k*/
bool deleteRepeat(SeqList &seqList) {if (seqList.length == 0) {return false;}int k=0;for (int i=1; i < seqList.length; i++) {if (seqList.data[k] != seqList.data[i]) {seqList.data[++k] = seqList.data[i];}}seqList.length = k + 1;return true;
}int main() {SeqList seqList={1, 1, 1, 2, 2, 3, 3, 3, 4, 4};seqList.length = 10;deleteRepeat(seqList);printf("\n");for (int i = 0; i < seqList.length; i++) {printf("%d ", seqList.data[i]);}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 50etf期权行权采用什么交割方式 ?
  • Python爬虫与MySQL完美结合:从环境搭建到实战优化
  • Linux——文件(1)
  • SQL注入实例(sqli-labs/less-9)
  • Ubuntu22.04安装Docker教程
  • 微信开放平台更换服务器证书通知
  • Tomcat 漏洞
  • 基于飞腾E2000的科东软件Intewell工业实时操作系统方案
  • 音质提升秘籍:专业音频剪辑软件汇总
  • 【蘑菇书EasyRL】强化学习,笔记整理
  • 数据结构(5.5_1)——哈夫曼树
  • 深入解析 Vue.js 的 nextTick
  • 【从零开始一步步学习VSOA开发】创建VSOA的server端
  • python 定时清理日志(schedule)
  • 2024实验班选拔考试(热身赛)
  • 30天自制操作系统-2
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Cumulo 的 ClojureScript 模块已经成型
  • HomeBrew常规使用教程
  • iOS 颜色设置看我就够了
  • Java精华积累:初学者都应该搞懂的问题
  • jdbc就是这么简单
  • Swoft 源码剖析 - 代码自动更新机制
  • Unix命令
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 动态魔术使用DBMS_SQL
  • 机器学习中为什么要做归一化normalization
  • 每天一个设计模式之命令模式
  • 目录与文件属性:编写ls
  • 山寨一个 Promise
  • 使用API自动生成工具优化前端工作流
  • 使用common-codec进行md5加密
  • -- 数据结构 顺序表 --Java
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 消息队列系列二(IOT中消息队列的应用)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # 计算机视觉入门
  • ## 1.3.Git命令
  • (C语言)球球大作战
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (SpringBoot)第七章:SpringBoot日志文件
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (循环依赖问题)学习spring的第九天
  • (一)appium-desktop定位元素原理
  • (已解决)什么是vue导航守卫
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .gitignore文件设置了忽略但不生效
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net 反编译_.net反编译的相关问题
  • .NET构架之我见