![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 76
c++ 实践 常用 数据结构
ZhengXinTang
习重要! 学而实习之, 才叫学习!
只学而不习, 不实践, 这叫本末倒置, 丢了大头顾小头;
因缘际会,所有巧合即为 和合事物;
当一个人悄悄的在反省时,努力时,改过时, 命运的齿轮便被他转动了。
展开
-
ch6_8 数组中前K个高频元素
1.1 涵盖知识点完全二叉树定义,满足 堆序型的完全二叉树 形成 :堆;使用堆 实现优先级队列;优先级队列:优先级队列中元素的出队顺序 与元素的优先级有关。优先级队列中, 三个参数的意义:template <typename T, typename Container=std::vector<T>, typename Compare=std::less<T> >class priority_queu原创 2022-04-28 11:55:40 · 474 阅读 · 0 评论 -
c++ 中auto 类型
2.1 cpp 中的 auto1. auto 的应用场景auto 在实际开发中到底有什么应用呢?下面我们列举两个典型的应用场景。1.1 使用 auto 定义迭代器auto 的一个典型应用场景是用来定义 stl 的迭代器。我们在使用 stl 容器的时候,需要使用迭代器来遍历容器里面的元素;不同容器的迭代器有不同的类型,在定义迭代器时必须指明。而迭代器的类型有时候比较复杂,书写起来很麻烦,请看下面的例子:#include <vector>using namespace std;int原创 2022-04-17 19:59:37 · 3157 阅读 · 0 评论 -
ch6_6逆波兰表达式 && ch6_7滑动窗口最大值
1. 逆波兰表达式lc 150 逆波兰表达式有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。注意 两个整数之间的除法只保留整数部分。可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。1.1 逆波兰表达式特点遇到数字则入栈, 遇到算术符 则去除栈顶的两个数字;stoi 函数: 将传入的字符串 转为 int 类型;int stoi (const string& str, size_t* idx原创 2022-04-27 20:11:26 · 162 阅读 · 0 评论 -
ch6_4有效的括号 && ch6_5 删除字符串中所有相邻重复项
1. 有效括号lc 20给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true1.1 分析当接受到 左括号时, 将其对应的右括号 压入到栈中;当真正接受到右括号时, 将栈中的右括号弹出;接受完毕时, 如果栈中不为空, 则括号不匹原创 2022-04-26 10:18:47 · 178 阅读 · 0 评论 -
ch6_2 栈实现队列 && ch6_3 队列实现栈
1. 栈实现队列使用两个栈, 一个作为输入栈,一个作为输出栈;将一个栈当作输入栈,用于压入 push\texttt{push}push传入的数据;另一个栈当作输出栈,用于pop\texttt{pop}pop 和 peek\texttt{peek}peek 操作。每次 pop\texttt{pop}pop或 peek\texttt{peek}peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。1.2...原创 2022-04-25 15:36:03 · 114 阅读 · 0 评论 -
ch4_6 KMP 字符串匹配 && ch4_7 重复子字符串
1.KMP前缀串: 指一串字符中,以第一个字符为开头的所有连续子串,但不包括最后一个字符;后缀串: 指一串字符中,以最后一个字符为结尾的所有连续子串, 但不包括第一个字符;1.1 前缀表最长相同前缀后缀有的也称前缀表,该前缀表通常用一个 next 数组表示,该数组中存储了, 模式串中每个位置上对应的最长相等前缀后缀的长度数值;前缀表的作用:用来指示的模式串中的指针应该回退到哪个位置,即记录了当模式串与文本串不匹配时,模式串应该回退到哪里开始重新匹配;1.2 前缀表的运作过原创 2022-04-23 19:52:25 · 352 阅读 · 0 评论 -
ch4_4反转字符串中的单词&& ch4_5左转字符串
ch4_4 反转字符串中的单词lc 151 反转字符串中的单词给你一个字符串 s ,颠倒字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。4.1 分析C++ 语言中, 字符串是可变的:去重三种情况下的空格将整个字原创 2022-04-23 19:50:55 · 92 阅读 · 0 评论 -
ch4-1~ch4-3 字符串反转
1. lc 344 字符串反转编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1)O(1)O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:[“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]示例 2:输入:[“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a原创 2022-04-23 19:49:25 · 74 阅读 · 0 评论 -
ch3_8三数之和 & ch3_9 四数之和
1. 三数之和关键点:不同的情况下, 去重的意义不一样:不等于0 时的去重:此时去重的意义在于:去除的元素是不满足和为零条件的元素; (即这两个元素都是不满足条件的重复元素,且这两个元素又都是相同的,所以继续移动, 具体而言,便是: 三数之和大于0:右指针往左移动后, 此时判断的是: 右指针移动后指针位置上的元素 是否和 移动前位置上的元素是否相同, 若相同,表明 当前指针位置上的元素,仍然不满足和为0 的条件, 所以右指针继续左移;三数之和大于0:左指针往右移动后,原理, 同上原创 2022-04-20 07:41:22 · 579 阅读 · 0 评论 -
ch3_6四数相加 && ch3_7赎金信
1. 四数相加lc454给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果不会超过 2^31 - 1 。例如:输入: A = [ 1, 2] B = [-2,-1] C = [-1, 2] D = [ 0, 2] 输出原创 2022-04-19 15:09:31 · 63 阅读 · 0 评论 -
ch3_4 快乐数字 ch3_5 数组中的两数之和
1. 快乐数字2. 数组中的两数之和考虑到, 数组和 集合set 自身的局限性:数组的大小受限, 而且如果元素很少,而哈希值太大会造成内存空间的浪费。set是一个集合,集合中只能存放一个 key (关键字), 而不能存放关键字所对应的值; 本题要判读 关键字(数组中的元素) 是否存在, 还要保存 关键字所对应的值(数组元素所对应的下标),所以 最小组成成分,是由两个元素构成, 故set 不用,使用map;2.0 map的类型map ,map是一种key value的存原创 2022-04-18 10:42:13 · 100 阅读 · 0 评论 -
ch3_2字母异位词&& ch3_3 两个数组的交集
lc242 字母异位词1.关键点的思想: 哈希映射思想,使用了数组的下标代表了 对应的字符,使用下标位置中的保存数值, 代表了该字符出现的次数了;具体讲来:根据字母与 字母a 算差值, 将该差值映射到数组的下标位置上, 并将该位置上的数值加一, 代表该字母出现一次了;实现步骤:如果两个字符串长度不等, 直接返回 false;将每个字符减去字符 “a”, 他们相减时,便是对应到0~25 这二十六个字母;使用一个大小为 26 的数组record, 初始值默认为0,原创 2022-04-15 19:04:08 · 327 阅读 · 0 评论 -
ch2_7链表中的环节点ch2_8 两个单链表相交节点
题解注意题中的pos: 代表了链表尾部, 接入链表中索引的下标位置, 指的是从这个位置开始, 是环的入口处, 也即环的第一个节点;首先确定一点:使用两个指针, fast 指针每次走两步, slow 每次走一步, 那么如果有环,fast 一定先进入环内;然后解决两个问题:如果有环, 为什么 fast 和slow 一定是在环内相遇;假如,下图是一个环,然后让 fast指针在任意一个节点开始追赶slow指针,fast和slow各自再执行一次, fast和slow就相遇了这是因为fa原创 2022-04-14 19:38:47 · 886 阅读 · 0 评论 -
ch2_5 链表两两交换节点&&ch2_6删除倒数N的节点
问题关键点;两个交换节点, 是不断更新变化的, 所以应该放在循环体中;curNode: 代表 两个交换节点前一个节点, 我们称作开始节点;curNode->next: 开始节点后的第一节点, 原始值称为节点1;curNode->next->next: 开始节点后的第二节点, 原始值称为节点2;curNode->next->next->next: 两个交换节点 之后的一个节点, 称为节点3;在节点更新前, 先保存两个节点:需要保存节原创 2022-04-13 10:23:45 · 392 阅读 · 0 评论 -
ch2_2移除链表中的节点
lc2031.单链表节点链表中的节点类型, 是一种结构体指针,即 链表节点 本身就是 一个指针类型,只不过是一种特殊类型的 结构体指针;该结构体指针中{自定义的数值;指向下一个节点的结构体指针;自定义的 节点构造函数, 方便于初始化化时,可以直接赋值;}struct ListNode{int val; // 节点中的数值struct* next; // 节点中指向下一个节点的指针, 该指针类型是结构体, 所以内存中 取字节时, 按照结构体的类型取字节;// 节点的构造函数原创 2022-04-10 15:04:25 · 455 阅读 · 0 评论 -
2_3 单链表的设计 C++
//// Created by respecting-god on 2022/2/19.//#include<stddef.h>#include<iostream>using namespace std;class SingleLinkedList{public: // define the linkNode struct LinkNode{ int val; LinkNode* next; Link原创 2022-02-20 21:34:08 · 52 阅读 · 0 评论 -
2_2 c++ 链表节点的定义,创建, 以及删除;
#include <stdio.h>#include <stdlib.h>//#include <cstdio>//#include <vector>#include<iostream>#include<cstdlib>using namespace std;//定义一个结构体 ListNode的结构struct ListNode { int val; //当前结点的值用val表示 st原创 2022-02-17 11:57:46 · 1857 阅读 · 0 评论 -
ch1_5长度最小子数组&ch1_6螺旋矩阵
lc209 长度最小子数组1. 问题关键点使用双指针 ,i,ji, ji,j 两个指针代表了子数组的起始位置,和终止位置;i,ji, ji,j 两个指针 ,初始位置都是从头开始;子数组的后指针,始终是向后移动的, 以此来不断满足,求和?那么问题的关键点,在于初始指针何时移动?2. 方法关键点初始位置移动的情况:便是当 当前子序列和sum 大于等于 规定的 target;此时:将 sum 和减去 iii 位置上的数nums[i]nums[i]nums[i], 并且将iii+原创 2022-04-08 09:47:27 · 234 阅读 · 0 评论 -
ch1_4 有序数组的平方,三指针移动
方法关键点:vector nums = {-40, -1, 0, 3, 10}根据问题, 数组的最小负值在左端, 最大正直在右端;平方之后,所有的数都是 正数!!!原数组中,是按照从小到达排列的,负数的平方会很有可能大于正数的平方,也就是先确定整数的平方那么在原数组中,使用两个指针 i,ji,ji,j, 分别从最左端,和最右端, 往中间开始移动;移动的过程中, 必须注意 iii,jjj 并非是同时移动的, 而是依次移动的:只有当该位置上数, 被处理过后,即原创 2022-04-07 15:39:15 · 89 阅读 · 0 评论 -
ch1_3 数组覆盖重复元素
while val != nums[fastindex]当 下标 fastindex 上的数值 !=移除的元素 val原创 2022-04-06 09:47:48 · 228 阅读 · 0 评论 -
ch1_2 二分查找 C++
1. 数组 array1.1 数组的属性array 数组的特性:在内存中是以连续地址存放的, 并且存放的内容具有相同的数据类型;数组下标是从0开始;根据 属性1, 对数组进行删除和 增加元素时, 需要移动其他元素; (而所谓的删除,是通过后序元素往前移动,覆盖待删除的元素实现的;)属性2, 在数组中根据下标查找元素时, 时间复杂度O(1)O(1)O(1);1.2 c++ 中的数组 arrayc ++ 中声明一个数组, 需要指定数组中存储的数据类型,以及数据的大小数量:int arr1[原创 2022-04-05 14:31:18 · 1291 阅读 · 0 评论 -
ch1_1 c++中的 数组array 与 容器vector
1. 数组 array1.1 数组的属性array 数组的特性:在内存中是以连续地址存放的, 并且存放的内容具有相同的数据类型;数组下标是从0开始;根据 属性1, 对数组进行删除和 增加元素时, 需要移动其他元素; (而所谓的删除,是通过后序元素往前移动,覆盖待删除的元素实现的;)属性2, 在数组中根据下标查找元素时, 时间复杂度O(1)O(1)O(1);1.2 c++ 中的数组 arrayc ++ 中声明一个数组, 需要指定数组中存储的数据类型,以及数据的大小数量:int arr1[原创 2022-04-05 08:44:13 · 1434 阅读 · 0 评论 -
C++中的指针类型与构造函数,析构函数
1. 指针类型的作用1.1 指针取出字节任何类型的指针占用的空间大小都是相同的(32位CPU是4字节;64位CPU是8字节)既然任何类型的指针占用的空间大小都是相同的,为什么指针还需要类型呢?指针只是指向了一个内存地址,但是当存内存中取值的时候,系统不知道你要从当前指针指向的地址,取几个字节,指定了指针的类型后,系统就知道取几个字节了。char类型取1个字节,short类型取2个字节,int类型去4个字节。int main() { int i = 123456原创 2022-04-10 16:32:56 · 4196 阅读 · 0 评论 -
C++ 中为什么要有“ 指针” 和 “ 引用”
普通变量,直接保存值。指针:它保存一个值(或 null)的地址,可以检索指向该地址处的值 。指针可以初始化为NULL,且指针的值在初始化后可以改变,即指向其它的存储单元。引用: 表明上是为变量创建了第二个名字, 它的本质是一个指针,可以使用它来读取或修改存储在该变量中的原始数据。引用定义时必须初始化,且在进行初始化后就不会再改变了,是 C++ 支持的第三种基本变量类型;引用不能为空,指针可以为空,这样的好处是引用可以很安全的使用,不用担心非法访问这类系统错误。坏处则是你不能..原创 2022-04-04 22:02:33 · 2864 阅读 · 1 评论 -
C++中的引用
原文地址在学习 C 与 C++ 语言时,指针与引用类型(C++)总是同学们最头疼的知识点之二。事实上,很多学习过包含指针和/或引用概念程序设计语言的同学也仍然对于为什么会存在这些语言元素的原因缺乏思考。下述代码以 C++ 为例。本文首发于 DGideas 的博客。1.指针为什么要有指针?现代通用电子计算机在程序运行时将所需数据存储于内部存储器(内存)中。通过机器可理解的语言,我们能令电子计算机存取内存中某一指定位置数据,就比如编写一个统计字符串字面量中含有多少个英文小写字母 a 的程序一样,这个程序原创 2022-04-04 21:36:29 · 64 阅读 · 0 评论 -
g++ 编译过程体会与命令行参数argc,argv[]详解
###############原创 2022-04-06 11:02:39 · 2454 阅读 · 0 评论 -
浙大版《C语言程序设计(第3版)》题目集 习题11-5 指定位置输出字符串 (20 分)
浙大版《C语言程序设计(第3版)》题目集 习题11-5 指定位置输出字符串原创 2019-03-24 17:53:25 · 1354 阅读 · 0 评论 -
习题3.9 堆栈操作合法性
原创 2019-07-21 20:30:53 · 753 阅读 · 0 评论 -
链式队列的基本思想(C语言版)
对链式结构的,简单理解,如果有不对的地方,欢迎指正,谢谢。原创 2019-08-10 19:41:20 · 267 阅读 · 0 评论 -
C++ 的运算符重载
C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作...原创 2019-08-11 20:21:09 · 862 阅读 · 0 评论