C++数据结构与算法
C++数据结构与算法
1.顺序表代码模版
C++顺序表模版
#include <iostream>
using namespace std;
// 可以根据需要灵活变更类型
#define EleType intstruct SeqList
{EleType* elements;int size;int capacity;
};// Init a SeqList
void InitList(SeqList* list, int capacity)
{list->elements = new EleType[capacity]();list->size = 0;list->capacity = capacity;
}// Destory a SqeList
void DestoryList(SeqList* list)
{list->size = 0;delete[] list->elements;
}// Is Empty
bool IsEmpty(SeqList* list)
{return list->size == 0;
}// Inser a value into SeqList at position
void Insert(SeqList* list, int index, EleType element)
{// Check conditionsif (index < 0 || index > list->size){throw std::invalid_argument("Invalid index when insert a value into SeqList");}// Enlarge the capacity, normally enlarge 1 timesif (list->size == list->capacity){int newCapacity = list->capacity * 2;EleType* newElements = new EleType[newCapacity]();for (int i = 0; i < list->size; i++){newElements[i] = list->elements[i];}delete[] list->elements;list->elements = newElements;list->capacity = newCapacity;}// Insert the datafor (int i = list->size; i > index; --i){list->elements[i] = list->elements[i-1];}list->elements[index] = element;list->size++;
}// Delet the value at index
void DeleteElement(SeqList* list, int index)
{if (index < 0 || index >= list->size){throw std::invalid_argument("Invalid index of the elements which needed delete");return;}for (int i = index; i < list->size - 1; i++){list->elements[i] = list->elements[i + 1];}list->size--;
}// Find element in list, return the index
int FindElement(SeqList* list, EleType element)
{for (int i = 0; i < list->size; i++){if (list->elements[i] == element){return i;}}return -1;
}// Get element at index in the list
EleType GetElement(SeqList* list, int index)
{if(index < 0 || index >= list->size){throw std::invalid_argument("Invalid index to get the element in list");}return list->elements[index];
}// Update the value at index in list
void UpdateElement(SeqList* list, int index, EleType value)
{if (index < 0 || index >= list->size){throw std::invalid_argument("Invalid index to Update the element in list");}list->elements[index] = value;
}// Show
void Show(SeqList* list)
{if (list != NULL){std::cout << "list size: " << list->size << std::endl;std::cout << "List capacity:" << list->capacity << std::endl;for (int i = 0; i < list->size; i++){std::cout << "value[" << i << "] = " << list->elements[i] << " " << std::ends;}std::cout << std::endl;}else{std::cout << "The list is null" << std::endl;}
}
2.杭电算法2006-求奇数的乘积
1.题目–如图
2.使用顺序表解题代码
// 调用使用代码模版
int numbers[10000];
int main()
{int n;// 循环用例while(cin >> n){SeqList list;InitList(&list, 1);int prod = 1;for(int i = 0 ; i < n; ++i){int x; cin >> x;Insert(&list, i, x);EleType tmp = GetElement(&list, i);if(tmp % 2 == 1){prod = prod * tmp;}}cout << prod <<endl;}return 0;
}
3.使用数组解题
#include <iostream>
using namespace std;
int main()
{int n;while(cin >> n){for(int i = 0; i < n; ++i){int x;cin >> x;numbwers[i] = x;}int prod = 1;for(int i = 0; i < n; ++i){int tmp = numbwers[i];if(tmp % 2 == 1){prod = prod * tmp;}}cout << prod << endl;}return 0;
}
输入:
3 1 2 3
4 2 3 4 5
输出
3
15
3.顺序表模版更新
#include <iostream>
using namespace std;
// 可以根据需要灵活变更类型
#define EleType intstruct SeqList
{EleType* elements;int size;int capacity;
};// Init a SeqList
void InitList(SeqList* list, int capacity)
{list->elements = new EleType[capacity]();list->size = 0;list->capacity = capacity;
}// Destory a SqeList
void DestoryList(SeqList* list)
{list->size = 0;delete[] list->elements;
}// Is Empty
bool IsEmpty(SeqList* list)
{return list->size == 0;
}// Inser a value into SeqList at position
void Insert(SeqList* list, int index, EleType element)
{// Check conditionsif (index < 0 || index > list->size){throw std::invalid_argument("Invalid index when insert a value into SeqList");}// Enlarge the capacity, normally enlarge 1 timesif (list->size == list->capacity){int newCapacity = list->capacity * 2;EleType* newElements = new EleType[newCapacity]();for (int i = 0; i < list->size; i++){newElements[i] = list->elements[i];}delete[] list->elements;list->elements = newElements;list->capacity = newCapacity;}// Insert the datafor (int i = list->size; i > index; --i){list->elements[i] = list->elements[i-1];}list->elements[index] = element;list->size++;
}// Delet the value at index
void DeleteElement(SeqList* list, int index)
{if (index < 0 || index >= list->size){throw std::invalid_argument("Invalid index of the elements which needed delete");return;}for (int i = index; i < list->size - 1; i++){list->elements[i] = list->elements[i + 1];}list->size--;
}// Find element in list, return the index
int FindElement(SeqList* list, EleType element)
{for (int i = 0; i < list->size; i++){if (list->elements[i] == element){return i;}}return -1;
}// Get element at index in the list
EleType GetElement(SeqList* list, int index)
{if(index < 0 || index >= list->size){throw std::invalid_argument("Invalid index to get the element in list");}return list->elements[index];
}// Update the value at index in list
void UpdateElement(SeqList* list, int index, EleType value)
{if (index < 0 || index >= list->size){throw std::invalid_argument("Invalid index to Update the element in list");}list->elements[index] = value;
}// Show
void Show(SeqList* list)
{if (list != NULL){std::cout << "list size: " << list->size << std::endl;std::cout << "List capacity:" << list->capacity << std::endl;for (int i = 0; i < list->size; i++){std::cout << "value[" << i << "] = " << list->elements[i] << " " << std::ends;}std::cout << std::endl;}else{std::cout << "The list is null" << std::endl;}
}
4.杭电算法2008-数值统计
1.题目–如图
2.使用顺序表解题
#include <iostream>
using namespace std;
// 使用模版
// EleType 为double类型int main()
{int n;while(cin >> n && n){// 创建初始化顺序表SeqListlist;InitList(&list, 1);// 输出数据for(int i = 0; i < n; ++i){eleType x;cin >> x;Insert(&list, i, x);}// 判断判断数据大小EleType tmp;int negative = 0;int positive = 0;int equalZero = 0;for(int i = 0; i < GetSize(&list); ++i){tmp = GetElement(&list, i);if(tmp > 1e-8){++positive;}else if(tmp < -1e-8){++negative;}else{++equalZero;}}cout << negative <<" "<< equalZero <<" " << positive << endl;}return 0;
}
5.杭电算法2014-青年歌手大奖赛_评委会打分
1.题目–如图
2.顺序表解题
void Solution2014()
{int n;while (cin >> n){SeqList list;InitList(&list, 1);EleType x;for (int i = 0; i < n; i++){cin >> x;Insert(&list, i, x);}EleType max = -1000000;EleType min = 1000000;EleType sum = 0;for (int i = 0; i < list.size; i++){if (max < list.elements[i]){max = list.elements[i];}if (min > list.elements[i]){min = list.elements[i];}sum += list.elements[i];}sum -= max;sum -= min;printf("%.2f\n", sum/(n-2));}
}
int main()
{Solution2014();return 0;
}
3.使用数组解题
#include <iostream>
using namespace std;
int main()
{int n;while(cin >> n){doubel numbers[n];// 输入数据for(int i = 0; i < n; i++){double x;cin >> x;numbers[i] = x}double eleMax = -10000000;double eleMin = 10000000;double sum = 0;for(int i = 0; i < n; ++i){double ele = numbers[i];if(ele > eleMax){eleMax = ele;}if(ele < eleMin){eleMin = ele;}sum += ele;}sum -= eleMax;sum -= eleMin;sum /= (n -2);printf("%.2f\n", sum);}return 0;
}
6.LeetCode-LCP 01 猜数字
1.题目–如图
链接: LCP 01. 猜数字 - 力扣(LeetCode)
2.解题
class Solution {
public:int game(vector<int>& guess, vector<int>& answer) {int ret = 0;for(int i = 0; i < 3; ++i){if(guess[i] == answer[i])ret++;}return ret;}
};
7.LeetCode-LCP 06 拿硬币
1.题目–如图
2.解题:
class Solution {
public:int minCount(vector<int>& coins) {int count = 0;for(int i= 0; i < coins.size(); i++){count += coins[i] / 2;if(coins[i]%2 == 1){count+=1;}}return count;}
};
3.减少内存的做法
class Solution {
public:int minCount(vector<int>& coins) {int ret = 0;for(int i = 0; i < coins.size(); ++i){// 加上1 后再 整除2得到结果, cpu做加法快,分支慢// 代替分支+/ + %的做法ret += (coins[i] + 1) / 2;}return ret;}
};
8.LeetCode-LCP 2057 值相等的最小索引
1.题目–如图
1.解题:
class Solution {public:int smallestEqual(vector<int>& nums) {int ret = -1;for(int i = 0; i < nums.size(); ++i){if(i % 10 == nums[i]){return i;}}return ret; }
};
9.LeetCode-LCP 485 最大连续的个数
1.题目–如题
2.解题
class Solution {
public:int findMaxConsecutiveOnes(vector<int>& nums) {// 00 111 01 0 1111 0000 11111111int ret = 0; // 最终结果int pre = 0; // 到当前数字最大连续1的个数(局部)for(int i = 0; i < nums.size(); ++i){if(nums[i] == 1){pre += 1;// 局部与整体比较if(pre > ret){ret = pre;}}else{pre = 0;}}return ret;}
};
3.减少内存的做法
原理: 将每一个数提取出来, 并作为if的条件判断 , 最终的落脚点是在当前的值和上一个的值的比较。
class Solution {
public:int findMaxConsecutiveOnes(vector<int>& nums) {int l = 0, r = 0;int maxlen = 0;int curlen = 0;while(r < nums.size()){int in = nums[r];r++;if(in){curlen++;}else{maxlen = max(maxlen, curlen);curlen = 0;l = r;}}maxlen = max(maxlen, curlen);return maxlen;}
};
10.LeetCode-LCP 2006. 差的绝对值为 K 的数对数目
1.题目–如图
2.解题
class Solution {
public:int countKDifference(vector<int>& nums, int k) {int ret = 0;for(int i = 0; i < nums.size(); i++){for(int j = i+1; j < nums.size(); j++){if(abs(nums[i] - nums[j]) == k){ret++;}}}return ret;}
};
11.LeetCode-LCP 1464. 数组中两元素的最大乘积
1.题目–如图
2.解题:
暴力破解
class Solution {
public:int maxProduct(vector<int>& nums) {int ret = 0;int pre = 0;for(int i = 0; i < nums.size(); i++){for(int j = 0; j < nums.size(); j++){if(i != j){ret = (nums[i] - 1) * (nums[j] - 1);if(pre < ret){pre = ret;}}}}return max(ret, pre);}
};
减少时间复杂度的做法
找到最大值的下标和次最大值的下标即可
class Solution {
public:int maxProduct(vector<int>& nums) {int maxIndex = 0;for(int i = 1; i < nums.size(); i ++){if(nums[i] > nums[maxIndex]){maxIndex = i;}}int subMaxIndex = -1;for(int i = 0; i < nums.size(); i ++){if(i != maxIndex){if(nums[i] > nums[subMaxIndex]){subMaxIndex = i;}}}return (num(maxIndex)-1) * (num(subMaxIndex) - 1);}
};
12.LeetCode-2535. 数组元素和与数字和的绝对差
1.题目–如图
2.解题
思路: 元素累加到x。 每一个元素的数字和累加到y, 得到x y差值的绝对值
class Solution {
public:int differenceOfSum(vector<int>& nums) {int x = 0;int y = 0;for(int i = 0; i < nums.size(); i++){x += nums[i];while(nums[i]){y += nums[i]%10;nums[i] /= 10;}}return abs(x-y);}
};
相关文章:

C++数据结构与算法
C数据结构与算法 1.顺序表代码模版 C顺序表模版 #include <iostream> using namespace std; // 可以根据需要灵活变更类型 #define EleType intstruct SeqList {EleType* elements;int size;int capacity; };// Init a SeqList void InitList(SeqList* list, int capa…...
Paddle Inference部署推理(三)
三:Paddle Inference推理 导出模型 Paddle Inference支持使用飞桨静态图模型进行推理,您可以通过以下两种方式获取静态图模型: (1)飞桨框架导出推理模型 飞桨框架在训练模型过程中,会在本地存储最终训练…...
python(四)os模块、sys模块
一、os模块 os 模块提供了很多程序与操作系统直接交互的功能 名称描述示例os.getcwd()得到当前工作目录,即当前Python脚本工作的目录路径‘D:\python’os.listdir()返回指定目录下的所有文件和目录名>>> os.listdir()os.remove()函数用来删除一个文件>…...

Oracle 数据库 IDENTITY 列
IDENTITY列是Oracle数据库12c推出的新特性。之所以叫IDENTITY列,是由于其支持ANSI SQL 关键字 IDENTITY,其内部实现还是使用SEQUENCE。 不过推出这个新语法也是应该的,毕竟MyQL已经有 AUTO_INCREMENT列,而SQL Server也已经有IDENT…...
【前端】js vue 屏蔽BackSpace键删除键导致页面后退的方法
【前端】js vue 屏蔽BackSpace键删除键导致页面后退的方法 方法一:通过全局事件监听阻止 Backspace 导致页面后退 在 main.js 或组件的 mounted 中添加以下代码: //【前端】js vue 屏蔽BackSpace键删除键导致页面后退的方法 document.addEventListener…...

深入解密 K 均值聚类:从理论基础到 Python 实践
1. 引言 在机器学习领域,聚类是一种无监督学习的技术,用于将数据集分组成若干个类别,使得同组数据之间具有更高的相似性。这种技术在各个领域都有广泛的应用,比如客户细分、图像压缩和市场分析等。聚类的目标是使得同类样本之间的…...

ArcGIS应用指南:ArcGIS制作局部放大地图
在地理信息系统(GIS)中,制作详细且美观的地图是一项重要的技能。地图制作不仅仅是简单地将地理数据可视化,还需要考虑地图的可读性和美观性。局部放大图是一种常见的地图设计技巧,用于展示特定区域的详细信息ÿ…...

非root用户安装CUDA
1.使用nvidia-smi查看当前驱动支持的最高CUDA版本: 表示当前驱动最多支持cuda12.1 2.进入cuda安装界面,https://developer.nvidia.com/cuda-toolkit-archive,选择想要安装的版本,例如想要安装CUDA11.4: 如果需要查看ub…...
单点修改,区间求和或区间询问最值(线段树)
【题目描述】 给定一个长度为n的非负整数序列,接下来有m次操作,操作共有3种:一是修改序列中某个元素的大小,二是求某个区间的所有元素的和,三是询问某个区间的最大值。整数序列下标从1开始。n<10^5, m<10^5。 …...

线性代数空间理解
学习线性代数已经很久,但是在使用过程中仍然还是不明所以,比如不知道特征向量和特征值的含义、矩阵的相乘是什么意思、如何理解矩阵的秩……。随着遇到的次数越来越多,因此我决定需要对线性代数的本质做一次深刻的探讨了。 本次主要是参考了3…...

Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序
在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序 IntelliJ IDEA 是一个用 Java 编写的集成开发环境 (IDE)。它用于开发计算机软件。此 IDE 由 Jetbrains 开发,提供 Apache 2 许可社区版和商业版。它是一种智能的上下文感知 IDE,可用于在各种应用程序…...

C51相关实验
C51相关实验 LED //功能:1.让开发板的LED全亮,2,点亮某一个LED,3.让LED3以5Hz的频率闪动#include "reg52.h"#define LED P2 sbit led1 LED^1;void main(void) {LED 0xff;//LED全灭led1 0;while(1)//保持应用程序不退出{} }LED 输出端是高…...
docker离线安装linux部分问题整理
0:离线安装docker过程命令 echo $PATH tar -zxvf docker-26.1.4.tgz chmod 755 -R docker cp docker/* /usr/bin/ root 权限 vim /etc/systemd/system/docker.service --------- [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.do…...

ISUP协议视频平台EasyCVR萤石设备视频接入平台银行营业网点安全防范系统解决方案
在金融行业,银行营业厅的安全保卫工作至关重要,它不仅关系到客户资金的安全,也关系到整个银行的信誉和运营效率。随着科技的发展,传统的安全防护措施已经无法满足现代银行对于高效、智能化安全管理的需求。 EasyCVR视频汇聚平台以…...

递推概念和例题
一、什么是递推 递推算法以初始值为基础,用相同的运算规律,逐次重复运算,直至求出问题的解,它的本质是按照固定的规律逐步推出(计算出)下一步的结果 这种从“起点”重复相同的的方法直至到达问题的解&…...
开发工具 - VSCode 快捷键
以下是一些常用的 VS Code 快捷键(Windows、macOS 和 Linux 均适用,略有不同): 常用快捷键 功能Windows/LinuxmacOS打开命令面板Ctrl Shift P 或 F1Cmd Shift P打开文件Ctrl OCmd O保存文件Ctrl SCmd S全部保存Ctrl K,…...

数据库的联合查询
数据库的联合查询 简介为什么要使⽤联合查询多表联合查询时MYSQL内部是如何进⾏计算的构造练习案例数据案例:⼀个完整的联合查询的过程 内连接语法⽰例 外连接语法 ⽰例⾃连接应⽤场景示例表连接练习 ⼦查询语法单⾏⼦查询多⾏⼦查询多列⼦查询在from⼦句中使⽤⼦查…...
【人工智能】基于PyTorch的深度强化学习入门:从DQN到PPO的实现与解析
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 深度强化学习(Deep Reinforcement Learning)是一种结合深度学习和强化学习的技术,适用于解决复杂的决策问题。深度Q网络(DQN)和近端策略优化(PPO)是其中两种经典的算法,被广泛应用于游戏、机器人控…...

【深度学习】【RKNN】【C++】模型转化、环境搭建以及模型部署的详细教程
【深度学习】【RKNN】【C】模型转化、环境搭建以及模型部署的详细教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【RKNN】【C】模型转化、环境搭建以及模型部署的详细教程前言模型转换--pytorch转rknnpytorch转onnxonnx转rkn…...
CentOS环境上离线安装python3及相关包
0. 准备操作系统及安装包 准备操作系统环境: 首先安装依赖包,安装相应的编译工具 [rootbigdatahost bin]# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-d…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...