23王道数据结构代码题全解(一)
计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里
代码全部是用 C++ 写的,都可以编译运行,包含暴力解和最优解。
持续更新,目前更新进度:
- 线性表 7/14
- …
仅供参考! 会包含一些考试不让写的语法,可能也会有一些错误。
顺序表结构体
考试直接使用,一般不会让你写出结构体
#define ElemType int
#define MaxSize 50typedef struct {ElemType data[MaxSize];int length;
}SqList;
2.2.3, 1
- 暴力解法一般就是循环,循环一次不行,就来两次,两次不行三次 …
- 时间复杂度 O(n),空间复杂度O(1)
int del_min(SqList &list) {if (list.length == 0) {cout << "Error!" << endl;return -1;}// 1.假设0号元素最小int min = list.data[0]; int pos = 0;// 2.循环找出最小元素并记录位置, 从1开始for (int i = 1; i < list.length; i++) {if (list.data[i] < min) {min = list.data[i];pos = i;}}// 3.删除最小元素并用最后一个元素替换list.data[pos] = list.data[list.length - 1];list.length--; return min;
}
2.2.3, 2
- 暴力就是再整一个数组,原数组从末尾循环遍历放到新数组里
- 要求空间复杂度O(1)的话,从头循环到中间,交换头尾元素
- 偶数或者奇数个元素,循环到中间,都是
< length/2
,因为如果长度为4或者5,都是循环到下标为1即停,为5的时候最中间的元素(下标为2)不需要移动。 - 时间复杂度O(n)
void reverse(SqList &list) {for (int i = 0; i < list.length / 2; i++) {// 不让用swap()的话,可以定义一个辅助变量来交换swap(list.data[i], list.data[list.length - 1 - i]);}
}
2.2.3, 3
- 暴力就是再整一个数组,循环遍历把不等于x的元素都放入新数组
- 时间复杂度O(n),空间复杂度O(1)就要求一次循环内解决
- 把所有等于x的元素都扔到最后,然后 length 减掉就可以了
- 也就是把所有不等于x的元素扔到前面,后面自然就是等于x的元素了
void del_x(SqList &list, int x) {int k = 0;for (int i = 0 ; i < list.length ; i++) {// 1.把所有要保存的值都放在前面if (list.data[i] != x) {list.data[k++] = list.data[i];}}// 2.直接扔掉后面的元素list.length = k;
}
- 一次循环 -> 双指针
- 类似快排,从两端向中间移动,将左边的x与右边的非x交换
// 太麻烦了,不如上一个方法
void del_x_2(SqList &list, int x) {int i = -1, j = list.length, k = 0;while (i < j) {while (list.data[++i] != x); while (list.data[--j] == x) k++;if (i < j) {swap(list.data[i], list.data[j]);k++;}}list.length -= k;
}
2.2.3, 4
- 跟第3题一样的解法
- 时间复杂度O(n),空间复杂度O(1)
void del_st(SqList &list, int s, int t) {if (s >= t || list.length == 0) {cout << "ERROR!" << endl;return;}// 1.要保存的值都放在前面int k = 0; for (int i = 0; i < list.length; i++) {if (list.data[i] < s || list.data[i] > t) {list.data[k++] = list.data[i];}}// 2.直接扔掉后面的值list.length = k;
}
- 王道答案:自找麻烦的做法
- 有序 -> 从头循环找
>= s
,继续找>t
的元素 - 一次循环,或者找t从后往前再循环一次
while
+++
真的非常好用,最好像我这样:先-1然后用前++- 时间复杂度O(n),空间复杂度O(1)
void del_st2(SqList &list, int s, int t) {if (s >= t || list.length == 0) {cout << "ERROR!" << endl;return; }// 1.找到大于等于s的值int i = -1;while (list.data[++i] < s);// 2.如果全部元素均小于sif (i >= list.length) {cout << "ERROR!" << endl;return; }// 3.找到大于t的元素int j = i-1;while (list.data[++j] <= t);// 4.前移,直接占住被删元素的位置while(j < list.length) {list.data[i++] = list.data[j++];}list.length = i;
}
2.2.3, 5
- 与第4题只差了不是有序表,但3,4题的解法仍然可以用
- 只要把要保存的值放在前面,再扔掉后面的值就可以了
- 不要被答案限制了你的思路❌
- 时间复杂度O(n),空间复杂度O(1)
void del_st(SqList &list, int s, int t) {if (s >= t || list.length == 0) {cout << "ERROR!" << endl;return;}// 1.要保存的值都放在前面int k = 0; for (int i = 0; i < list.length; i++) {if (list.data[i] < s || list.data[i] > t) {list.data[k++] = list.data[i];}}// 2.直接扔掉后面的值list.length = k;
}
- 王道答案的做法非常麻烦,不推荐!
2.2.3, 6
- 有序列表 ➡️ 相同元素排列在一起
- 暴力,新开一个数组,将不同元素存入
- 需要两个指针分别操作两个数组
- 时间复杂度O(n),空间复杂度O(n)
void del_same(SqList &list) {if (list.length == 0) return;// 1.新开一个数组SqList copied = list;copied.data[0] = list.data[0];// 2.把不同元素存入int k = 0;for (int i = 1; i < list.length; i++) {if (list.data[k] != copied.data[i]) {copied.data[++k] = list.data[i];}}// 3.新换旧copied.length = k + 1;list = copied;
}
- 仔细想想,其实并不需要两个数组,双指针就可以
- 前一个存储,后一个判断
void del_same2(SqList &list) {if (list.length == 0) return;int k = 0;for (int i = 1; i < list.length; i++) {if (list.data[k] != list.data[i]) {list.data[++k] = list.data[i];}}list.length = k + 1;
}
2.2.4, 7
- 这种题太典型了,合并有序顺序表以及合并有序链表,建议全文背诵hh
- 循环,取下两个之中的较小的放入结果表中
- 最后那个表还有剩余就把剩下的部分全部加入结果表
SqList merge(SqList A, SqList B) {SqList C;if (A.length + B.length > MaxSize) {cout << "ERROR!" << endl;return C;}int i = 0, j = 0, k = 0;// 1.两两比较,小的存入结果表while (i < A.length && j < B.length) {if (A.data[i] <= B.data[j])C.data[k++] = A.data[i++];elseC.data[k++] = B.data[j++];}// 2.剩下的全部加入结果表,两个循环只会有一个运行while (i < A.length) C.data[k++] = A.data[i++];while (i < B.length) C.data[k++] = B.data[j++];// 3.返回结果表C.length = k;return C;
}
- 补充一下归并排序
void merge_sort(int l, int r) {if (l >= r) return;int mid = (l+r) >> 1;merge_sort(l, mid);merge_sort(mid+1, r); int k = 0, i = l, j = mid+1;while (i <= mid && j <= r) {if (q[i] <= q[j]) tmp[k++] = q[i++];else tmp[k++] = q[j++];}while (i <= mid) tmp[k++] = q[i++];while (j <= r) tmp[k++] = q[j++];for (i = l, j = 0; i <= r; i++, j++) q[i++] = tmp[j++];
}
23王道数据结构代码题全解(一)相关推荐
- 23王道数据结构代码题全解(二)
计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里 代码全部是用 C++ 写的,都可以编译运行,包含暴力解和最优解. 持续更新,目 ...
- 23王道数据结构代码题全解(三)
计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里 代码全部是用 C++ 写的,都可以编译运行,包含暴力解和最优解. 持续更新,目 ...
- 第十三届蓝桥杯省赛 python B组复盘(三道代码题全AC居然省一了)
第十三届蓝桥杯省赛 python B组复盘(三道代码题全AC居然省一了)
- 计算机数据结构代码题----Day02
计算机数据结构代码题----Day02 顺序表代码题 题目01 从顺序表中删除其数值在给定数值为s与t之间,包含(s和t),要求(s<t)的所有元素,如果s或t的顺序不合理或者顺序表为空,则显示 ...
- 【23考研】计算机408数据结构代码题强化阶段划重点(王道书)
视频链接:[23考研]10分钟带你整理408数据结构强化阶段代码题复习重点 本篇只适合考408的同学,请自主命题的同学自觉右上角×掉 因为王道书为了照顾自主命题的同学,所以很多算法也给出了代码实现,实 ...
- 王道数据结构代码——线性表
目录 0. 前言 1. 顺序表 2. 单链表--不带头结点 3. 单链表--带头结点 4. 双链表--带头结点 5. 循环单链表--L指向表头 6. 双链表--L指向表尾 7. 循环双链表 8. 静态 ...
- 23王道数据结构二叉搜索树(BST)算法题(6-11题)总结(伪代码)
6.判断给定的二叉树是否是二叉排序树 算法思想:中序遍历,一棵树为二叉排序树即左右子树为二叉排序树,且当前根节点和左右子树呈递增序列,对左右子树也是如此判断,显然是个递归过程 ...
- java数据结构代码(全)
java数据结构 排序 ^运算: 找一个单数 找两个个单数 对数器 冒泡排序 选择排序 插入排序 希尔排序 快速排序 桶排序 基数排序 归并排序 基于归并排序的小数和 堆排序 二分 查找极小值 稀疏数 ...
- 2022中国可信链大赛初赛赛题全解
所有的题目我都放在了代码仓库,由于太长就不放入wp了,感兴趣的可自行移步. 题目预览 TrusterLenderPool 分析 攻击 SVip 分析 攻击 Merkle 分析 攻击 OwnerBuy ...
最新文章
- Skyline 扩展模块简介
- git分支指的是_你一定知道的Git分支模型
- 简单的鼠标可拖动div 兼容IE/FF
- C语言 —— 预定义符号__FILE____LINE___func__(编写调试函数printf , debug)
- ExtJS4为form表单必填项添加红色*标识
- VC++ 中 try-catch-finally 语句 如何在获取正常信息是写一些操作语句
- 属于HTML文档头部相关标记,下列选项中,属于HTML文档头部相关标记的是 答案:title/titlemeta /...
- php设计模式之桥接模式
- ros openwrt 分流_常平:推进“截污大会战”补贴助力企业雨污分流
- 微信授权获取code(微信支付)
- 计算机由指定用户登陆
- php去除空格和换行
- CPDA数据分析师证书含金量高吗?
- 「经济理财」跟简七学理财之理财训练营(下)
- 89c52汇编语言实现跑马灯,汇编语言实现24个跑马灯制作
- 大数据如何使用OSM模型和AARRR模型搭建指标体系
- zxing生成带logo的二维码
- 来谈谈O2O线上线下电商解决方案
- LaTex 表示 波浪线
- MATLAB SCI论文绘图及绘图窗口大小设置
热门文章
- PAT乙级考试经验分享
- 快速排序之——挖坑法实现
- 端午节书法作品楷书内容_端午节里欣赏 书法家 张书武的作品
- 新版 CSDN Markdown 编辑器上线公告(Alpha 2.0)
- knewton适应性学习白皮书(2)
- 4.5-那些漂亮软件是怎么做出来的?为啥自己做的好丑
- 新玺配资:市场强势修复 量能或成隐患
- TSNE高维数据降维可视化工具 + python实现
- 网上购物需要支付商品钱数加运费。假设某网上书店与快递公司签订了快递费用,每件5元。对于买家,商家设置在购买金额超过一定限额时(100)免运费
- 联邦学习中的non-iid总结