C++
文章平均质量分 70
RBLT
say it,do it,be it
展开
-
完全理解图(上)——图的概念、存储及遍历
图的存储结构、遍历原创 2021-08-03 08:56:50 · 1138 阅读 · 2 评论 -
完全理解二叉树(下)——平衡二叉树、二叉排序树、哈夫曼树
二叉树的应用1. 平衡二叉树二叉树可以用于查找元素,对于如下这颗二叉树:对其的遍历相当于对链表的遍历,因此找到元素5需要从头开始,查找5次,但是如果树的形状是这样:从根结点出发只需要查找3次即可找到元素5。1.1 定义左右子树高度差不超过1的二叉树称为平衡二叉树(AVL树),注意是对于树中的任意结点。例如:都不是平衡二叉树。结点的平衡因子 = 左子树高 - 右子树高,平衡因子的绝对值不超过1,如下图所示:1.2 存储结构typedef struct AVLTreeNode*原创 2021-06-11 10:10:51 · 905 阅读 · 0 评论 -
完全理解二叉树(中)——二叉树与树、森林的转化及遍历
完全理解二叉树(上)——二叉树的概念、遍历、构造以及线索化1. 树与二叉树的转化现有如下一颗树:将其转化为二叉树的过程为:加线:在同一层中,将兄弟结点(注意没有堂兄弟结点)连接起来,下图中红色部分。去线:对每一个结点来说,只保留其第一个孩子结点,其余孩子结点的连线全部删除,下图中蓝色部分。去掉蓝色部分得到:最后调整层序,黑线必为左孩子,红线为右孩子:2. 森林与二叉树的转化现有如下一个森林:将其转化为二叉树的过程为:树转化成二叉树,先将森林中所有的树转化成二叉树:原创 2021-06-03 10:24:00 · 767 阅读 · 0 评论 -
完全理解二叉树(上)——二叉树的概念、遍历、构造以及线索化
术语结点的度:结点的子树个数树的度:树的所有结点中最大的度数结点的层次:规定根结点在 1 层,其他任一结点的层数是其父结点的层数 +1树的深度(高度):树中所有结点中的最大层次叶结点:度为 0 的结点父结点:有子树的结点子结点:A为B的父结点,则B为A的子结点兄弟结点:具有同一父结点的各结点祖先结点:沿树根到某一结点路径上的所有结点都是这个结点的祖先结点子孙结点:某一结点的子树中所有的结点堂兄弟结点:父结点在同一层的结点森林:若干颗互不相交的树的集合树一、定义n 个结点构成原创 2021-06-01 19:40:17 · 443 阅读 · 0 评论 -
如何通俗易懂地理解分治
本节需要先理解递归的含义:如何通俗易懂地理解递归一、引例描述对给定数组中的数字进行排序,要求在O(nlogn)时间内完成样例输入:7 1 5 3 2 4 7 6输出:1 2 3 4 5 6 7 二、原理定义(引自维基百科)在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范型。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分析思路一(归并):对于数组排序的问题,可以考虑原创 2021-05-24 20:36:55 · 343 阅读 · 0 评论 -
如何通俗易懂地理解递归
一、引例描述给定一个数字 n(范围在0~10),求 n 的阶乘样例输入:0 输出:1输入:5输出:120算法设计首先最容易想到的就是利用循环做,即进行 n-1 次循环,然后每次循环中进行累乘,最后输出结果,再加一个特殊值判断(0! = 1),那么很容易编写代码如下:#include <iostream>int main(){ int n = 0,num = 1; std::cin >> n; while(n > 0)原创 2021-05-14 15:48:32 · 3265 阅读 · 0 评论 -
c++模板类链表(模板结构体,模板类,运算符重载)
一、存放数据的结构体首先需要自定义一个存放数据的结构体模板,假定结构体中需要存放的数据类型有int,double,char和任意类型的数组,因此就有template <typename U>struct LNode { int a; double b; char c; U* array;};考虑到结构体内有数组,在之后初始化的工作和查找数据的时候需要重新写循环,因此在结构体中重载赋值和等于运算符。void operator= (const U a)const { int原创 2021-02-09 20:41:24 · 942 阅读 · 0 评论 -
C++存在重复元素(三种解法详解)
题目链接:存在重复元素题目描述给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。样例输入与输出示例1:输入:[1,2,3,1]输出:true示例2:输入:[1,2,3,4]输出:false示例3:输入:[1,1,1,3,3,4,3,2,4,2]输出:true解法1(排序)思路将所有元素排好序,然后扫描数组,如果一个数与它前一个元素相等,那么就是重复的。代码class Solu原创 2021-02-01 11:41:39 · 8549 阅读 · 0 评论 -
C++旋转数组(三种解法详解)
C++旋转数组(三种解法详解)题目链接:旋转数组题目描述给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。附加要求尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?样例输入与输出输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5原创 2021-01-28 15:32:28 · 3004 阅读 · 0 评论 -
通过程序理解 C++ static 关键字的作用
部分定义来源于牛客网C++静态成员变量的初始化一、对于函数定义和代码块之外的变量声明,static修改标识符的链接属性,由默认的external变为internal,作用域和存储类型不改变,这些符号只能在声明它们的源文件中访问。全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量.静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会...原创 2020-02-26 15:59:33 · 280 阅读 · 0 评论 -
不用循环做数组排序
不用循环做数组排序利用递归改写冒泡排序#include <iostream>using namespace std;int k = 0,index = 0,n = 10;int sort(int A[],int i,int j,int n){ if(A[j] > A[i]) k++; return (n > 0)?sort(A...原创 2020-02-25 13:16:24 · 1154 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(七)
强类型枚举在传统 C++中,枚举类型并非类型安全,枚举类型会被视作整数,则会让两种完全不同的枚举类型可以进行直接的比较(虽然编译器给出了检查,但并非所有),甚至枚举类型的枚举值名字不能相同,这不是我们希望看到的结果。C++11 引入了枚举类(enumaration class),并使用 enum class 的语法进行声明:enum class new_enum : unsigned...原创 2019-07-03 17:11:03 · 246 阅读 · 0 评论 -
C++11/14介绍(四)——新增容器(二)
无序容器传统 C++ 中的有序容器 std::map/std::set,这些容器内部通过红黑树进行实现,插入和搜索的平均复杂度均为 O(log(size))。在插入元素时候,会根据 < 操作符比较元素大小并判断元素是否相同,并选择合适的位置插入到容器中。当对这个容器中的元素进行遍历时,输出结果会按照 < 操作符的顺序来逐个遍历。而无序容器中的元素是不进行排序的,内部通过 Hash ...原创 2019-08-07 15:24:28 · 383 阅读 · 0 评论 -
C++11/14介绍(四)——新增容器(一)
一、std::arraystd::array会在编译时创建一个固定大小的数组,std::array不能够被隐式的转换成指针,使用std::array很简单,只需指定其类型和大小即可:std::array<int, 4> arr= {1,2,3,4};int len = 4;std::array<int, len> arr = {1,2,3,4}; // 非法, 数...原创 2019-08-07 15:15:39 · 571 阅读 · 0 评论 -
常用C++11特性
详细介绍:C++11/14 高速上手教程一、右值引用与std::move如下代码:std::string tmp("bert")std::string name(tmp)第一行声明了一个对象tmp,用"bert"字符串进行初始化第二行声明了一个对象name,使用参数tmp调用string的构造函数,因此对象name复制了"bert"的一个副本,如下:如下代码:std::stri...原创 2019-08-02 13:42:18 · 272 阅读 · 0 评论 -
C++11/14介绍(五)——智能指针和引用计数(三)
std::unique_ptrstd::unique_ptr 是一种独占的智能指针,它禁止其他智能指针与其共享同一个对象,从而保证了代码的安全:std::unique_ptr<int> pointer = std::make_unique<int>(10); // make_unique 从 C++14 引入std::unique_ptr<int> p...原创 2019-08-08 19:00:45 · 323 阅读 · 0 评论 -
C++11/14介绍(五)——智能指针和引用计数(二)
std::shared_ptrstd::shared_ptr是一种智能指针,它能够记录多少个shared_ptr共同指向一个对象,从而消除显式的调用delete,当引用计数变为0时,就会将对象删除。std::make_shared能够用来显式的使用new,所以std::make_shared会分配创建传入参数中的对象,并返回这个对象类型的std::shared_ptr指针,ex:#inclu...原创 2019-08-08 18:00:21 · 417 阅读 · 0 评论 -
C++11/14介绍(三)——语言运行期的强化(三)
右值引用一、左值,右值的纯右值、将亡值,右值左值:赋值符号左边的值。左值是表达式后依然存在的持久对象右值:右边的值。指表达式结束后就不在存在的临时对象,C++11中为了引入强大的右值引用,将右值的概念进行了进一步的划分,分为纯右值:纯粹的右值,要么是纯粹的字面量,ex:10,true;要么是求值结果相当于字面量或匿名临时对象,ex:1+2。非引用返回的临时变量、运算表达式...原创 2019-08-01 21:19:28 · 373 阅读 · 0 评论 -
C++11/14介绍(三)——语言运行期的强化(二)
函数对象包装器一、std::functionLambda表达式的本质是一个函数对象,当lambda表达式的捕获列表为空时,Lambda表达式还能作为一个函数指针进行传递:#include <iostream>using foo = void (int);void functional(foo f){ f(1);}int main(){ auto f...原创 2019-08-01 14:36:51 · 263 阅读 · 0 评论 -
C++11/14 高速上手教程
目录1、弃用特性和与C语言的兼容性2、语言可用性的强化2.1、nullptr与constexpr2.2、类型推导2.3、区间迭代2.4、初始化列表### 2.5、模板增强2.6、面向对象增强2.7、强类型枚举3、语言运行期的强化3.1、lambda表达式...原创 2019-07-05 16:02:32 · 1131 阅读 · 0 评论 -
C++11/14介绍(三)——语言运行期的强化(一)
Lambda表达式lambda表达式的基本语法如下:[捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型{ //函数体}捕获列表可以理解为参数的一种类型,lambda表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。根据传递的行为,捕获列表分为以下几种。值捕获void learn_lamb...原创 2019-07-05 15:46:11 · 395 阅读 · 0 评论 -
C++11/14介绍(四)——新增容器(三)
一、元组std::tuple传统C++中的容器,除了std::pair外,没有现成的数据结构能用来存放不同类型的数据,但是std::pair的缺陷是只能保存;两个元素。二、元组基本操作元组的使用有三个核心的函数:std::make_tuple:构造元组std::get:获得元组某个位置的值std::tie:元组拆包//在C++14下运行#include <tuple>...原创 2019-08-07 15:47:05 · 358 阅读 · 0 评论 -
C++11/14介绍(五)——智能指针和引用计数(四)
std::weak_ptr#include <iostream>#include <memory>class A;class B;class A {public: std::shared_ptr<B> pointer; ~A() { std::cout << "A 被销毁" << std::...原创 2019-08-09 17:21:19 · 290 阅读 · 0 评论 -
蓝桥杯之跳蚱蜢
原作:https://blog.csdn.net/qq_36306833/article/details/78992459题目描述:标题:跳蚱蜢如图所示: 有9只盘子,排成1个圆圈。其中8只盘子内装着8只蚱蜢,有一个是空盘。我们把这些蚱蜢顺时针编号为 1~8每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,并且保持...转载 2018-03-08 20:24:16 · 2782 阅读 · 2 评论 -
C语言结构体中 char p[0]中p存在的作用
参考:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法牛客网有程序如下:typedef struct{ int a; char p[0];}buffer;问其中 p 有何作用?C99中,结构体中char p[0]被称为柔性数组,这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势:(1)、不需要初始化,数组名直接就是所在的偏移...原创 2019-09-24 10:55:34 · 1231 阅读 · 0 评论 -
最详解——无重复字符的最长子串
题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “w...原创 2019-08-31 11:22:25 · 249 阅读 · 0 评论 -
最详解——两数相加
题目描述给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -...原创 2019-08-30 15:58:59 · 694 阅读 · 0 评论 -
C++11/14介绍(五)——智能指针和引用计数(一)
引用计数这种计数是为了防止内存泄露而产生的。基本想法是对于动态分配的对象,进行引用计数,每当增加一次对同一个对象的引用,那么引用对象的引用计数就会增加一次,每删除一次引用,引用计数就会减一,当一个对象的引用计数减为零时,就自动删除指向的堆内存。在传统 C++ 中,『记得』手动释放资源,总不是最佳实践。因为我们很有可能就忘记了去释放资源而导致泄露。所以通常的做法是对于一个对象而言,在构造函数的时候...原创 2019-08-07 18:35:25 · 580 阅读 · 0 评论 -
C++11/14介绍(八)——其他杂项
一、新类型long long int 并不是 C++11 最先引入的,其实早在 C99,long long int 就已经被纳入 C 标准中,所以大部分的编译器早已支持。C++11 的工作则是正式把它纳入标准库,规定了一个 long long int 类型至少具备 64 位的比特数。二、noexcept 的修饰和操作C++ 相比于 C 的一大优势就在于 C++ 本身就定义了一套完整的异常处理...原创 2019-08-09 18:22:32 · 321 阅读 · 0 评论 -
C++11/14介绍(七)——语言级线程支持(二)
std::mutex, std::unique_lockC++11引入了 mutex 相关的类,其所有相关的函数都放在 <mutex> 头文件中。std::mutex 是 C++11 中最基本的 mutex 类,通过实例化 std::mutex 可以创建互斥量,而通过其成员函数 lock() 可以仅此能上锁,unlock() 可以进行解锁。但是在在实际编写代码的过程中,最好不去直接...原创 2019-08-09 18:09:51 · 432 阅读 · 0 评论 -
C++11/14介绍(七)——语言级线程支持(一)
std::threadstd::thread 用于创建一个执行的线程实例,所以它是一切并发编程的基础,使用时需要包含头文件,它提供了很多基本的线程操作,例如get_id()来获取所创建线程的线程 ID,例如使用 join() 来加入一个线程等等,例如:#include <iostream>#include <thread>void foo() { std::...原创 2019-08-09 17:58:17 · 411 阅读 · 0 评论 -
C++11/14介绍(六)——正则表达式库(二)
std::regex及其相关对字符串内容进行匹配的最常见手段就是使用正则表达式。可惜在传统 C++ 中正则表达式一直没有得到语言层面的支持,没有纳入标准库,而 C++ 作为一门高性能语言,在后台服务的开发中,对 URL 资源链接进行判断时,使用正则表达式也是工业界最为成熟的普遍做法。一般的解决方案就是使用 boost 的正则表达式库。而 C++11 正式将正则表达式的的处理方法纳入标准库的行列...原创 2019-08-09 17:53:48 · 450 阅读 · 0 评论 -
C++11/14介绍(六)——正则表达式库(一)
正则表达式简介正则表达式描述了一种字符串匹配的模式,一般使用正则表达式主要是实现下面三个需求:检查一个串是否包含某种形式的子串将匹配的子串替换从某个串中取出符合条件的子串正则表达式是由普通字符(例如 a 到 z)以及特殊字符组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。一、普通字符普通字符包括没有显式...原创 2019-08-09 17:43:09 · 983 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(六)
面向对象增强一、委托构造C++11 引入了委托构造的概念,这使得构造函数可以在同一个类中一个构造函数调用另一个构造函数,从而达到简化代码的目的class Base {public: int value1; int value2; Base() { value1 = 1; } Base(int value) : Base() { ...原创 2019-07-03 16:58:20 · 282 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(五)
模板增强一、外部模板传统 C++ 中,模板只有在使用时才会被编译器实例化。换句话说,只要在每个编译单元(文件)中编译的代码中遇到了被完整定义的模板,都会实例化。这就产生了重复实例化而导致的编译时间的增加。并且,我们没有办法通知编译器不要触发模板实例化。C++11 引入了外部模板,扩充了原来的强制编译器在特定位置实例化模板的语法,使得能够显式的告诉编译器何时进行模板的实例化:temp...原创 2019-07-03 16:34:02 · 322 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(四)
初始化列表提起初始化列表,首先想到的是类的构造函数的初始化列表:class test{private: int x,y;public: test(int a,int b):x(a),y(b){}};int main(){ test a(2,4); return 0;}如果是一个列表需要初始化,则可以这样写:class test{pr...原创 2019-07-03 09:35:01 · 241 阅读 · 0 评论 -
蓝桥杯之剪邮票
原文链接:http://www.cnblogs.com/Simon-X/p/6516380.html题目描述:如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来,要求必须是连着的。 (仅仅连接一个角不算相连) 比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。请你计算,一共有多少种不同的剪取方法。和一般的深搜思路不太一样:一般的深搜是定义四个方...转载 2018-03-13 19:14:22 · 384 阅读 · 0 评论 -
母牛的故事
题目描述有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?输入输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。n=0表示输入数据的结束,不做处理。输出对于每个测试实例,输出在第n年的时候母牛的数量。每个输出占一行。样例输入2450样例输出246#i...原创 2018-03-22 19:06:16 · 222 阅读 · 0 评论 -
0-1背包问题
题目描述:有 N 件物品和容量为 M 的背包,第 i 件物品的体积是 w[i],价值是 d[i],求解将哪些物品放入背包可以使价值总和最大,每种物品只有一件,可以选择放或者不放。(N<=3500 , M<=13000)第一行有两个数据,分别是 N 和 M,接下来 N 行,分别输入每件物品的体积和价值。样例输入4 61 42 63 122 7样例输出23看过很多大神们写的有关这个...原创 2018-03-06 21:24:30 · 224 阅读 · 0 评论 -
迷宫最短路问题——广搜
问题描述:存在这样一个迷宫:int mg[5][5]={ {0,0,0,0,0}, {0,1,0,1,0}, {0,1,1,0,0}, {0,1,1,0,1}, {0,0,0,0,0}};求一条从起点 (0,0) 到终点 (4,4) 的最短路,并打印出路径。思路:广度优先搜索,从 (0,0) 开始,将它下一步能到达的全部点标记出来,(0,1) 和 (1,0) ,然后将...原创 2018-02-25 19:39:37 · 543 阅读 · 0 评论