C++数据结构与算法

C++数据结构与算法

1.顺序表代码模版

C++顺序表模版

#include <iostream>
using namespace std;
// 可以根据需要灵活变更类型
#define EleType int

struct 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 conditions
	if (index < 0 || index > list->size)
	{
		throw std::invalid_argument("Invalid index when insert a value into SeqList");
	}

	// Enlarge the capacity, normally enlarge 1 times
	if (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 data
	for (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 int

struct 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 conditions
	if (index < 0 || index > list->size)
	{
		throw std::invalid_argument("Invalid index when insert a value into SeqList");
	}

	// Enlarge the capacity, normally enlarge 1 times
	if (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 data
	for (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 11111111
        int 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);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/923104.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贵州茅台[600519]行情数据接口

贵州茅台&#xff1a;实时行情 Restful API # 测试接口&#xff1a;可以复制到浏览器打开 https://tsanghi.com/api/fin/stock/XSHG/realtime?tokendemo&ticker600519获取股票实时行情&#xff08;开、高、低、收、量&#xff09;。 请求方式&#xff1a;GET。 Python示例…

Node.js的http模块:创建HTTP服务器、客户端示例

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战&#xff08;第2版&#xff09;&#xff08;Web前端技术丛书&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 要使用http模块&#xff0c;只需要在文件中通过require(http)引入即可。…

互联网直播/点播EasyDSS视频推拉流平台视频点播有哪些技术特点?

在数字化时代&#xff0c;视频点播应用已经成为我们生活中不可或缺的一部分。监控技术与视频点播的结合正悄然改变着我们获取和享受媒体内容的方式。这一变革不仅体现在技术层面的进步&#xff0c;更深刻地影响了我们。 EasyDSS视频直播点播平台是一款高性能流媒体服务软件。E…

基于Boost库的搜索引擎

本专栏内容为&#xff1a;项目专栏 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;基于Boots的搜索引擎 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识…

安全加固方案

交换机安全加固 查看是否关闭未使用的接口 25GE1/0/1、25GE1/0/47、25GE1/0/48需要使用&#xff0c;暂不关闭 system-view # interface Eth-Trunk99 shutdown quit interface Eth-Trunk100 shutdown quit interface Eth-Trunk110 shutdown quit interface 25GE1/…

Wonder3D本地部署到算家云搭建详细教程

Wonder3D简介 Wonder3D仅需2至3分钟即可从单视图图像中重建出高度详细的纹理网格。Wonder3D首先通过跨域扩散模型生成一致的多视图法线图与相应的彩色图像&#xff0c;然后利用一种新颖的法线融合方法实现快速且高质量的重建。 本文详细介绍了在算家云搭建Wonder3D的流程以及…

TMS FNC UI Pack 5.4.0 for Delphi 12

TMS FNC UI Pack是适用于 Delphi 和 C Builder 的多功能 UI 控件的综合集合&#xff0c;提供跨 VCL、FMX、LCL 和 TMS WEB Core 等平台的强大功能。这个统一的组件集包括基本工具&#xff0c;如网格、规划器、树视图、功能区和丰富的编辑器&#xff0c;确保兼容性和简化的开发。…

C# 命令行运行包

环境&#xff1a;net6 nuget包&#xff1a;Cliwrap 3.6.7 program&#xff1a; 相当于cmd运行命令&#xff1a;nuget search json static async Task Main(string[] args) {var cmd Cli.Wrap("D:\\软件\\Nuget\\nuget.exe").WithArguments(args >args.Add("…

Python 之网络爬虫

一.认识HTML 1.什么是HTML &#xff08;HyperText Markup Language&#xff09; HTML是超文本标记语言的缩写&#xff0c;它包含一系列的标签&#xff0c; “超文本”是一种组织信息的方式&#xff0c;利用HTML标记&#xff0c;告诉浏览器被标记的内容如何显示到浏览器页面上…

【数据分享】2001-2023年我国30米分辨率冬小麦种植分布栅格数据(免费获取)

小麦、玉米、水稻等各类农作物的种植分布数据在农业、环境、国土等很多专业都经常用到&#xff01; 本次给大家分享的是我国2001-2023年逐年的30米分辨率冬小麦种植分布栅格数据&#xff01;数据格式为TIFF格式&#xff0c;数据坐标为GCS_WGS_1984。该数据包括我国11个省份的冬…

C语言菜鸟入门·关键字·union的用法

目录 1. 简介 2. 访问成员 2.1 声明 2.2 赋值 3. 共用体的大小 4. 与typedef联合使用 5. 更多关键字 1. 简介 共用体&#xff08;union&#xff09;是一种数据结构&#xff0c;它允许在同一内存位置存储不同的数据类型&#xff0c;但每次只能存储其中一种类型的…

嵌入式驱动开发详解3(pinctrl和gpio子系统)

文章目录 前言pinctrl子系统pin引脚配置pinctrl驱动详解 gpio子系统gpio属性配置gpio子系统驱动gpio子系统API函数与gpio子系统相关的of函数 pinctrl和gpio子系统的使用设备树配置驱动层部分用户层部分 前言 如果不用pinctrl和gpio子系统的话&#xff0c;我们开发驱动时需要先…

低代码搭建crm系统实现财务管理功能模块

实例背景&#xff1a; CRM的项目&#xff0c;客户想要实现一个简单的财务记账功能&#xff0c;记录订单应收账款及收款记录。 具体要求&#xff1a; 1、要求收款时可以实时计算本次收款后的剩余应收。 2、要求记录AR的收款状态&#xff1a;未收款、部分收款、已收款。 实现…

C51相关实验

C51相关实验 LED //功能&#xff1a;1.让开发板的LED全亮&#xff0c;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 输出端是高…

【测试工具JMeter篇】JMeter性能测试入门级教程(一)出炉,测试君请各位收藏了!!!

一、前言 Apache JMeter是纯Java的开源软件&#xff0c;最初由Apache软件基金会的Stefano Mazzocchi开发&#xff0c;旨在加载测试功能行为和测量性能。可以使用JMeter进行性能测试&#xff0c;即针对重负载、多用户和并发流量测试Web应用程序。 我们选择JMeter原因 是否测试过…

人工智能(AI)与机器学习(ML)基础知识

目录 1. 人工智能与机器学习的核心概念 什么是人工智能&#xff08;AI&#xff09;&#xff1f; 什么是机器学习&#xff08;ML&#xff09;&#xff1f; 什么是深度学习&#xff08;DL&#xff09;&#xff1f; 2. 机器学习的三大类型 &#xff08;1&#xff09;监督式学…

STM32WB55RG开发(5)----监测STM32WB连接状态

STM32WB55RG开发----5.生成 BLE 程序连接手机APP 概述硬件准备视频教学样品申请源码下载参考程序选择芯片型号配置时钟源配置时钟树RTC时钟配置RF wakeup时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙LED配置设置工程信息工程文件设置参考文档SVCCTL_A…

虚拟机CentOS系统通过Docker部署RSSHub并映射到主机

公告 &#x1f4cc;更新公告 20241124-该文章已同步更新到作者的个人博客&#xff08;链接&#xff1a;虚拟机CentOS系统通过Docker部署RSSHub并映射到主机&#xff09; 一、编辑 YUM 配置文件 1、打开 CentOS 系统中的 YUM 软件仓库配置文件 vim /etc/yum.repos.d/CentOS-Ba…

React(五)——useContecxt/Reducer/useCallback/useRef/React.memo/useMemo

文章目录 项目地址十六、useContecxt十七、useReducer十八、React.memo以及产生的问题18.1组件嵌套的渲染规律18.2 React.memo18.3 引出问题 十九、useCallback和useMemo19.1 useCallback对函数进行缓存19.2 useMemo19.2.1 基本的使用19.2.2 缓存属性数据 19.2.3 对于更新的理解…

【漏洞复现】|百易云资产管理运营系统/mobilefront/c/2.php前台文件上传

漏洞描述 湖南众合百易信息技术有限公司&#xff08;简称&#xff1a;百易云&#xff09;成立于2017年是一家专注于不动产领域数字化研发及服务的国家高新技术企业&#xff0c;公司拥有不动产领域的数字化全面解决方案、覆盖住宅、写字楼、商业中心、专业市场、产业园区、公建、…