计划更新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王道数据结构代码题全解(一)相关推荐

  1. 23王道数据结构代码题全解(二)

    计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里 代码全部是用 C++ 写的,都可以编译运行,包含暴力解和最优解. 持续更新,目 ...

  2. 23王道数据结构代码题全解(三)

    计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里 代码全部是用 C++ 写的,都可以编译运行,包含暴力解和最优解. 持续更新,目 ...

  3. 第十三届蓝桥杯省赛 python B组复盘(三道代码题全AC居然省一了)

    第十三届蓝桥杯省赛 python B组复盘(三道代码题全AC居然省一了)

  4. 计算机数据结构代码题----Day02

    计算机数据结构代码题----Day02 顺序表代码题 题目01 从顺序表中删除其数值在给定数值为s与t之间,包含(s和t),要求(s<t)的所有元素,如果s或t的顺序不合理或者顺序表为空,则显示 ...

  5. 【23考研】计算机408数据结构代码题强化阶段划重点(王道书)

    视频链接:[23考研]10分钟带你整理408数据结构强化阶段代码题复习重点 本篇只适合考408的同学,请自主命题的同学自觉右上角×掉 因为王道书为了照顾自主命题的同学,所以很多算法也给出了代码实现,实 ...

  6. 王道数据结构代码——线性表

    目录 0. 前言 1. 顺序表 2. 单链表--不带头结点 3. 单链表--带头结点 4. 双链表--带头结点 5. 循环单链表--L指向表头 6. 双链表--L指向表尾 7. 循环双链表 8. 静态 ...

  7. 23王道数据结构二叉搜索树(BST)算法题(6-11题)总结(伪代码)

    6.判断给定的二叉树是否是二叉排序树 算法思想:中序遍历,一棵树为二叉排序树即左右子树为二叉排序树,且当前根节点和左右子树呈递增序列,对左右子树也是如此判断,显然是个递归过程              ...

  8. java数据结构代码(全)

    java数据结构 排序 ^运算: 找一个单数 找两个个单数 对数器 冒泡排序 选择排序 插入排序 希尔排序 快速排序 桶排序 基数排序 归并排序 基于归并排序的小数和 堆排序 二分 查找极小值 稀疏数 ...

  9. 2022中国可信链大赛初赛赛题全解

    所有的题目我都放在了代码仓库,由于太长就不放入wp了,感兴趣的可自行移步. 题目预览 TrusterLenderPool 分析 攻击 SVip 分析 攻击 Merkle 分析 攻击 OwnerBuy ...

最新文章

  1. Skyline 扩展模块简介
  2. git分支指的是_你一定知道的Git分支模型
  3. 简单的鼠标可拖动div 兼容IE/FF
  4. C语言 —— 预定义符号__FILE____LINE___func__(编写调试函数printf , debug)
  5. ExtJS4为form表单必填项添加红色*标识
  6. VC++ 中 try-catch-finally 语句 如何在获取正常信息是写一些操作语句
  7. 属于HTML文档头部相关标记,下列选项中,属于HTML文档头部相关标记的是 答案:title/titlemeta /...
  8. php设计模式之桥接模式
  9. ros openwrt 分流_常平:推进“截污大会战”补贴助力企业雨污分流
  10. 微信授权获取code(微信支付)
  11. 计算机由指定用户登陆
  12. php去除空格和换行
  13. CPDA数据分析师证书含金量高吗?
  14. 「经济理财」跟简七学理财之理财训练营(下)
  15. 89c52汇编语言实现跑马灯,汇编语言实现24个跑马灯制作
  16. 大数据如何使用OSM模型和AARRR模型搭建指标体系
  17. zxing生成带logo的二维码
  18. 来谈谈O2O线上线下电商解决方案
  19. LaTex 表示 波浪线
  20. MATLAB SCI论文绘图及绘图窗口大小设置

热门文章

  1. PAT乙级考试经验分享
  2. 快速排序之——挖坑法实现
  3. 端午节书法作品楷书内容_端午节里欣赏 书法家 张书武的作品
  4. 新版 CSDN Markdown 编辑器上线公告(Alpha 2.0)
  5. knewton适应性学习白皮书(2)
  6. 4.5-那些漂亮软件是怎么做出来的?为啥自己做的好丑
  7. 新玺配资:市场强势修复 量能或成隐患
  8. TSNE高维数据降维可视化工具 + python实现
  9. 网上购物需要支付商品钱数加运费。假设某网上书店与快递公司签订了快递费用,每件5元。对于买家,商家设置在购买金额超过一定限额时(100)免运费
  10. 联邦学习中的non-iid总结