中缀表达式转后缀表达式C++实现 中缀表达式转后缀表达式也是近年来找工作笔试、面试、考研机试,算法竞赛中的考点,所以学会它也是很有必要的,因为这种问题的代码比较模板化,建议读者直接背诵模板,但是不能死记硬背,而是在理解算法思路的基础上背诵此代码。
表达式求值C++实现 表达式求值这个知识点在最近几年的找工作笔试、面试,考研机试,各种算法竞赛笔试中出现的频率越来越高了;但是以前从来没有见过这种题要想在笔试面试中写出来不是一件简单的事情,网络上面大部分代码不够精炼,不方便理解和背诵模板;本篇博客提供了表达式求值的一道经典模板题,从理解表达式求值思路到整个代码模板,方便大家理解和背诵;旨在帮助广大笔试面试的朋友轻松应对此类问题。
ACM算法基础-并查集详解 并查集并查集的作用:1:将两个集合合并成一个集合2:询问两个元素是否在同一个集合中存储的方式:我们用树的形式来维护所有的集合,每个集合用一颗树来表示树中根节点的编号就是该集合的编号用一个fa[]fa[]fa[]数组来存储每一个点的父亲结点问题:如何判断树根?x=fa[x]x=fa[x]x=fa[x];如何判断每一个点所在的集合编号 while(x!=fa[x])x=fa[x]while(x!=fa[x]) x=fa[x]while(x!=fa[x])x=fa[x];如何合并两个集合?将
ACM算法基础-kmp算法详解 问题背景:kmp算法最直接的引用就是模式串和文本串的匹配,我们假设直接用暴力的方法进行匹配的话,方法很简单,就是两个指针,i指针最初指向文本串的起始位置,j指针最初指向模式串的起始位置,然后从文本串的起始位置开始每一位与模式串的每一位进行匹配,如果每一位都是相同的话,那么就继续匹配下一位,当我们只要匹配到有一位是不相等的时候,我们就将文本串的起始位置变成i1,然后继续从模式串的起始位置开始匹配,假设模式串和文本串的长度分别是n和m,时间复杂度是O(n*m),暴力确实太可怕了。
详解单调栈和单调队列问题 单调栈题目背景:假定有一个序列,现在我需要你来求每一个数左边离他最近的且比它小的数,如果存在的话,就输出这个数,如果不存在的话,我们就输出-1。其实这道题的暴力思路是特别简单的,直接两重循环,外面那重循环相当于遍历序列的每一个数,内层循环相寻找比外层循环指的那个数小的数,其实我们可以把这个操作直接想象成一个栈,当外层循环i指向一个数时,相当于已经将a[1]a[1]a[1],a[2]a[2]a[2]…… a[i−1]a[i-1]a[i−1]加入到栈里面,然后满足条件的数就是栈顶元素(因为栈顶元素
ACM算法基础-离散化算法详解 离散化算法离散化使用的范围首先给你一个序列,我们有一些数值,这些数值的范围比较大,值域可能是[0,109][0,10^9][0,109],但是里面的个数是很少的,个数可能是[0,105][0,10^5][0,105],有些时候我们需要利用这些值当作数组的下标来做,这是我们是不可能去开一个10910^9109的数组的,因此,我们就要将这个序列里面的数映射到一个从0开始的连续自然数。但是在离散化的时候我们应该注意哪一些问题呢?(1)序列里面的元素有可能是重复\color{red}{重复}重复的
差分解题详解(通俗易懂,包括二维差分) 差分解题详解差分的定义给你一组数据a1a2a3……ana1 a2 a3 …… ana1a2a3……an,你需要构造一个数组使得b1b2b3……bnb1 b2 b3 …… bnb1b2b3……bn,使得bbb数组的前缀和是aaa.(注意:b数组是自己需要构造的)b1=a1b1=a1b1=a1b2=a2−a1b2=a2-a1b2=a2−a1………bn=an−an−1bn=an-an-1bn=an−an−1a数组就称为b的前缀和,b数组就称为a的差分。何时可以用到差分我们有了b数组,
最强详解高精度减法 高精度减法模板适用的前提计算A-B的时候,当A的位数和B的位数都很大的时候,它就派上用场了。通用的模板有一下几个条件:1:A和B都是正数2:A>=B;疑问???当A和B中有负数的时候,我们是不是不能采用这个模板呢?其实这并不是模板的问题,而是我们在读入数据的时候我们需要分类讨论,以下就是分类讨论的几种情况:{−(∣A∣+∣B∣)A<0,B>0A<0,B<0{−(∣A∣−∣B∣)∣A∣>∣B∣∣B∣−∣A∣∣A∣<∣B∣∣A∣+∣B∣A>0,B&l
逆元的求解 求解逆元的思路1:什么是逆元如果两个数相乘对mmm取模等于1,则称这两个数互为逆元。2:费马小定理如果mmm是素数,aaa是任意数,则有am−1a^{m-1}am−1≡1(mmm);接下来根据逆元的定义则有aaa*am−2a^{m-2}am−2≡1(mmm);所以aaa%mmm的逆元就是am−2a^{m-2}am−2%mmm;am−2a^{m-2}am−2用快速幂来求解#include<iostream>#include<algorithm>using names
快速幂详解 快速幂的一些理解什么是快速幂当我们需要求解aba^bab,当bbb特别大的时候,我们求aba^bab是在复杂度为bbb内求出来的,有没有更加快的方法呢?能不能在logblog blogb的时间复杂度内求出来,当然是可以的,那就是用快速幂的方法。快速幂的求解步骤a20a^{2^0}a20a21a^{2^1}a21a22a^{2^2}a22……a2logba^{2^{logb}}a2logb我们发现其实求解的每一个指数都是2i2^i2i,iii其实是将十进制
Educational Codeforces Round 113 (Rated for Div. 2) 题解 [Educational Codeforces Round 113 (Rated for Div. 2)]题解A Balanced Substring题目大意:给你一个长度为n只含有a,b的字符串,字符串的长度从1-n,现在你需要找到一个平衡的字串(这个字串中a的个数是等于b的个数),如果这样的字串存在的话输出字串起点和终点的下标,没有的话输出-1 -1;解题思路:利用两层循环,外层循环代表寻找字串的起点的下标,内层循环表示终点的下标,如果找到了的话就将下标记录退出循环并输出,否则输出-1 -1。
用命令行的方式才运行c/c++程序(精准的测量程序运行的时间) 用命令行的方式才运行c/c++程序下面演示的是vs2019如何运行比如我运行的程序文件全部放在e盘1 e: 按enter2 cd (找到那个带.exe所在的目录,复制粘贴到上面)3 echo (输入程序的东西) | 文件名.exe这里的echo 51200 | Project1.exe 的含义是操作系统会自动将51200输入,这个在测试时间的时候就会非常的精准,如果不用这个的话,那么在计算时间的时候键盘输入的时间也会被计算在内,Project1.exe是程序名。cd 表示转换目录 c
Chinese Mahjong(中国麻将)题解 Chinese Mahjong1:每次读入13张牌,然后我们从34张牌中依次选取一张牌,看是否听这张牌,是否听这张牌,我们可以直接将这张牌直接加入到原来的13张牌中,看是否可以胡牌就行。2:现在我们来思考一下递归的过程,首先我们选出两张牌作为对子,当这张牌的张数大于等于2的时候,将这张牌拥有的张数减去2,假如我们有多张牌可以作为将,我们一次之选其中一张,其他的牌作为刻子或者是顺子。然后选出3对刻子或者是顺子,从第0层开始递归找刻子或者是顺子,当这张牌的张数大于等于3的时候,将这张牌的张数减去3,然后递归
Colored Cubes(彩色立方体)题解 彩色立方体(Colored Cubes)题解题意:有n个带颜色的立方体,每个面涂有一种颜色,要求重新涂尽量少的面,使的所有的立方体完全相同(两个立方体相同的含义是,存在一种旋转的方式,是的两个立方体对应面的颜色是相同的)思路首先定义一个数组p[i]表示编号i所在立方体中的位置,假设6个面的编号分别为1-6,其中位置和数字的对应关系如下,其实这就是一个标准的立方体的一个排列1 2 3 4 5 6前 右 上 下 左 后根据编号1,2,3,4,5
凸包的各种问题以及模板 一:求凸包的简洁板子1:求凸包#include <iostream>#include <algorithm>#include <iomanip>using namespace std;const int maxn = 50010;struct Point { int x, y; bool operator < (Point const& rhs) const {//重载为类的成员函数的时候,形参时运算符的右操作数
Codeforces Round #734 (Div. 3)题解 B2. Wonderful Coloring - 2题目的基本意思:1:每个元素要么不涂,要么只能涂一种颜色;2:每一种颜色涂的元素两两都是不相同的;3:每一种颜色涂的元素的个数时相同的;4:最后序列中涂的元素的个数要最大;解题的思路:1:去掉没必要涂的元素(1)该元素在序列中的个数要大于k(k表示颜色的总数),将超过k的那部分直接用0表示即可,不用涂;(2)为了保证每一种颜色涂的元素的个数时相同的,所以最后涂的元素的总个数一定是k的整数倍...