C++数据结构与算法

news2024/11/25 23:46:36

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);
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSH 反向端口转发-R

近期和同学聊到了他遇到的一个问题&#xff1a; 本地机器A&#xff0c;远程开发机C&#xff0c;机器A需要通过ssh连接开发机C进行开发&#xff0c;ssh直连不通&#xff0c;SCP传输文件的话就比较费劲&#xff0c;需要通过跳板机B&#xff0c;经过跳板机这一步骤可用&#xff0…

实时质检系统—静音检测功能设置流程

设置流程 1. 设置静音检测时间 在实时质检系统中&#xff0c;有一静音检测功能&#xff1a;可以对主叫或被叫在接通后的规定时间内开启静音检测。例&#xff1a;被叫静音检测配置设置了10&#xff0c;那么质检电话在接通后的10秒内&#xff0c;开启静音检测&#xff0c;如果被…

生成式UI 动态化SDK的研发(二)--实现垂直布局、水平布局以及文字组件

文章目录 1. 概述2. 效果展示2.1 垂直布局容器(Column)2.2 水平布局容器(Row )2.3 本文示例动态化模板DSL 3. 生成式UI 动态化SDK的渲染流程4. Column和Row组件实现4.1 Column组件4.1.1 视图的渲染4.1.2 事件解析绑定 4.2 Row组件4.3 文字组件(Text) 5. 源码地址 1. 概述 在前…

JavaScript中的this指向绑定规则(超全)

JavaScript中的this指向绑定规则&#xff08;超全&#xff09; 1.1 为什么需要this? 为什么需要this? 在常见的编程语言中&#xff0c;几乎都有this这个关键字&#xff08;Objective-C中使用的是self),但是在JavaScript中的this和常见的面向对象语言中的this不太一样 常见面…

Vision Transformer(VIT模型)

【11.1 Vision Transformer(vit)网络详解-哔哩哔哩】 https://b23.tv/BgsYImJ 工作流程&#xff1a; ①将输入的图像进行patch的划分 ②Linear Projection of Flatted patches&#xff0c;将patch拉平并进行线性映射生成token ③生成CLS token&#xff08;用向量有效地表示整…

2024年11月最新 Alfred 5 Powerpack (MACOS)下载

在现代数字化办公中&#xff0c;我们常常被繁杂的任务所包围&#xff0c;而时间的高效利用成为一项核心需求。Alfred 5 Powerpack 是一款专为 macOS 用户打造的高效工作流工具&#xff0c;以其强大的定制化功能和流畅的用户体验&#xff0c;成为众多效率爱好者的首选。 点击链…

C#里怎么样检测文件的属性?

C#里怎么样检测文件的属性? 对于文件来说,在C#里有一种快速的方法来检查文件的属性。 比如文件是否已经压缩, 文件是否加密, 文件是否是目录等等。 属性有下面这么多: 例子演示如下: /** C# Program to View the Information of the File*/ using System; using Syste…

网络安全,文明上网(4)掌握网络安全技术

前言 在数字化时代&#xff0c;个人信息和企业数据的安全变得尤为重要。为了有效保护这些宝贵资产&#xff0c;掌握一系列网络安全技术是关键。 核心技术及实施方式 1. 网络监控与过滤系统&#xff1a; 这些系统构成了网络防御体系的基石&#xff0c;它们负责监控网络通信&…

Vue 项目中如何使用FullCalendar 时间段选择插件(类似会议室预定、课程表)

本文中是基于VUEelementui项目中实现的前后端分离的前端功能部分&#xff1a; 插件的官方文档&#xff1a;FullCalendar 1.安装对应依赖&#xff08;统一安装版本为6.15&#xff09; npm install --save fullcalendar/core6.15 npm install --save fullcalendar/daygrid6.…

Oracle SQL优化③——表的连接方式

前言 表&#xff08;结果集&#xff09;与表&#xff08;结果集&#xff09;之间的连接方式非常重要&#xff0c;如果CBO选择了错误的连接方式&#xff0c;本来几秒就能出结果的SQL可能执行一天都执行不完。如果想要快速定位超大型SQL性能问题&#xff0c;就必须深入理解表连接…

小程序25- iconfont 字体图标的使用

项目中使用到图标&#xff0c;一般由公司设计进行设计&#xff0c;设计好后上传到阿里巴巴矢量图标库 日常开发过程中&#xff0c;也可以通过 iconfont 图标库下载使用自带的图标 补充&#xff1a;使用 iconfont 图标库报错&#xff1a;Failed to load font 操作步骤&#xff…

Java基于SpringBoot+Vue的藏区特产销售平台

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

selinux及防火墙

selinux说明 SELinux 是 Security-Enhanced Linux 的缩写&#xff0c;意思是安全强化的 linux 。 SELinux 主要由美国国家安全局&#xff08; NSA &#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 httpd进程标签&#xff08;/usr/share/nginx/html &#…

详细探索xinput1_3.dll:功能、问题与xinput1_3.dll丢失的解决方案

本文旨在深入探讨xinput1_3.dll这一动态链接库文件。首先介绍其在计算机系统中的功能和作用&#xff0c;特别是在游戏和输入设备交互方面的重要性。然后分析在使用过程中可能出现的诸如文件丢失、版本不兼容等问题&#xff0c;并提出相应的解决方案&#xff0c;包括重新安装相关…

生成对抗网络模拟缺失数据,辅助PAMAP2数据集仿真实验

PAMAP2数据集是一个包含丰富身体活动信息的数据集&#xff0c;它为我们提供了一个理想的平台来开发和测试HAR模型。本文将从数据集的基本介绍开始&#xff0c;逐步引导大家通过数据分割、预处理、模型训练&#xff0c;到最终的性能评估&#xff0c;在接下来的章节中&#xff0c…

IEC61850读服务器目录命令——GetServerDirectory介绍

IEC61850标准中的GetServerDirectory命令是变电站自动化系统中非常重要的一个功能&#xff0c;它主要用于读取服务器的目录信息&#xff0c;特别是服务器的逻辑设备节点&#xff08;LDevice&#xff09;信息。以下是对GetServerDirectory命令的详细介绍。 目录 一、命令功能 …

基于CNN+RNNs(LSTM, GRU)的红点位置检测(pytorch)

1 项目背景 需要在图片精确识别三跟红线所在的位置&#xff0c;并输出这三个像素的位置。 其中&#xff0c;每跟红线占据不止一个像素&#xff0c;并且像素颜色也并不是饱和度和亮度极高的红黑配色&#xff0c;每个红线放大后可能是这样的。 而我们的目标是精确输出每个红点的…

前端:JavaScript (学习笔记)【2】

目录 一&#xff0c;数组的使用 1&#xff0c;数组的创建 [ ] 2&#xff0c;数组的元素和长度 3&#xff0c;数组的遍历方式 4&#xff0c;数组的常用方法 二&#xff0c;JavaScript中的对象 1&#xff0c;常用对象 &#xff08;1&#xff09;String和java中的Stri…

全面解析多种mfc140u.dll丢失的解决方法,五种方法详细解决

当你满心期待地打开某个常用软件&#xff0c;却突然弹出一个错误框&#xff0c;提示“mfc140u.dll丢失”&#xff0c;那一刻&#xff0c;你的好心情可能瞬间消失。这种情况在很多电脑用户的使用过程中都可能出现。无论是游戏玩家还是办公族&#xff0c;面对这个问题都可能不知所…

STM32总体架构简单介绍

目录 一、引言 二、STM32的总体架构 1、三个被动单元 &#xff08;1&#xff09;内部SRAM &#xff08;2&#xff09;内部闪存存储器 &#xff08;3&#xff09;AHB到APB的桥&#xff08;AHB to APBx&#xff09; 2、四个主动&#xff08;驱动&#xff09;单元 &#x…