c++:蓝桥杯中的基础算法1(枚举,双指针)

2024-02-21 08:12

本文主要是介绍c++:蓝桥杯中的基础算法1(枚举,双指针),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

枚举

基础概念:

枚举(Enum)是一种用户定义的数据类型,用于定义一个有限集合的命名常量。在C++中,枚举类型可以通过关键字enum来定义。

下面是一个简单的枚举类型的定义示例:

#include <iostream>enum Color {RED,GREEN,BLUE
};int main() {Color c = RED;if(c == RED) {std::cout << "The color is red" << std::endl;} else if(c == GREEN) {std::cout << "The color is green" << std::endl;} else if(c == BLUE) {std::cout << "The color is blue" << std::endl;}return 0;
}

在上面的示例中,我们定义了一个枚举类型Color,其中包含了三个枚举常量RED、GREEN和BLUE。在main函数中,我们声明了一个Color类型的变量c,并将其赋值为RED。然后通过if语句来判断c的值,并输出相应的颜色信息。

枚举类型的常量默认从0开始递增,也可以手动指定初始值,例如:

enum Fruit {APPLE = 1,ORANGE,BANANA
};

在这个示例中,APPLE的值为1,ORANGE的值为2,BANANA的值为3。

枚举类型的常量可以直接通过枚举类型名访问,也可以通过枚举类型名加作用域解析运算符::来访问,例如:

Color c = Color::RED;

练习1:特别数的和

1.特别数的和 - 蓝桥云课 (lanqiao.cn)

解析: 

```cpp
#include <iostream>
using namespace std;// 定义一个函数f,用于判断一个整数是否包含数字0、1、2、9
int f(int x)
{while(x){int y=x%10; // 取出x的个位数if(y==0||y==1||y==2||y==9) // 判断个位数是否为0、1、2、9{return x; // 如果包含0、1、2、9,返回原整数x}x=x/10; // 去掉x的个位数,继续判断下一位}return 0; // 如果x不包含0、1、2、9,返回0
}int main()
{int n;cin>>n; // 输入一个整数nint num=0;for(int i=1;i<=n;i++){if(f(i)!=0) // 调用函数f判断i是否包含0、1、2、9{num+=i; // 如果包含,则将i加到num中}}cout<<num<<endl; // 输出结果numreturn 0;
}

练习2:反倍数

1.反倍数 - 蓝桥云课 (lanqiao.cn)

 


练习3:找到最多的数

1.找到最多的数 - 蓝桥云课 (lanqiao.cn)


双指针 

基础概念:

双指针算法是一种常用的解决问题的技巧,主要用于在数组或链表中寻找一些特定的结构。双指针算法通常有两种类型:快慢指针和左右指针。下面分别介绍这两种类型的双指针算法。

  1. 快慢指针: 快慢指针算法通常用于解决链表中的问题,例如判断链表是否有环、找到链表的中间节点等。

示例代码:

#include <iostream>
using namespace std;struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(NULL) {}
};bool hasCycle(ListNode* head) {ListNode* slow = head;ListNode* fast = head;while (fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;if (slow == fast) {return true; // 链表中存在环}}return false; // 链表中不存在环
}int main() {// 创建一个有环的链表ListNode* head = new ListNode(3);head->next = new ListNode(2);head->next->next = new ListNode(0);head->next->next->next = new ListNode(-4);head->next->next->next->next = head->next; // 使链表形成环cout << hasCycle(head) << endl; // 输出1,表示链表中存在环return 0;
}

  1. 左右指针: 左右指针算法通常用于解决数组中的问题,例如在有序数组中寻找两个数使它们的和等于目标值等。

示例代码:

#include <iostream>
#include <vector>
using namespace std;vector<int> twoSum(vector<int>& numbers, int target) {int left = 0;int right = numbers.size() - 1;while (left < right) {int sum = numbers[left] + numbers[right];if (sum == target) {return {left + 1, right + 1}; // 返回找到的两个数的下标(从1开始)} else if (sum < target) {left++;} else {right--;}}return {}; // 没有找到符合条件的两个数
}int main() {vector<int> numbers = {2, 7, 11, 15};int target = 9;vector<int> result = twoSum(numbers, target);for (int num : result) {cout << num << " ";}return 0;
}

以上是双指针算法的两种常见类型及其示例代码。双指针算法通常能够在O(n)的时间复杂度内解决问题,是解决一些数组和链表相关问题的高效方法。

练习1:回文判定

1.回文判定 - 蓝桥云课 (lanqiao.cn)

 

这篇关于c++:蓝桥杯中的基础算法1(枚举,双指针)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/731106

相关文章

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应