![](https://img-blog.csdnimg.cn/20201031203216814.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
题目
笔试真题
OJ题目
马小超i
你若盛开 清风自来
展开
-
解题中遇到的一些小知识点【杂记】
gets(s)函数与 scanf("%s",&s) 相似,但不完全相同,使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。数组初始化要用到#include<cstring>不管是一维还是二维数组都可以memset(a,0,sizeof(a));将一个数字转换成字符串#include<cstdlib>ito原创 2020-11-13 15:19:44 · 177 阅读 · 0 评论 -
牛客S2第12场:音符共鸣
链接:https://ac.nowcoder.com/acm/contest/10324/C来源:牛客网题目描述现在有n个音符和m对共鸣关系,编号为1~n,每个音符自己有一个奏响时的优美程度,共鸣关系(x,y,z)表示音符x和y同时奏响的额外优美程度是z,同时不奏响则为-z,其他情况为0。音符可以选择奏响或者不奏响,不奏响的音符没有优美程度。我们想知道最大的优美程度和是多少,我们不需要知道具体是哪些音符被奏响了,只需输出最大和即可。共鸣关系可能有重复,其共鸣效果也会重复叠加。数据包括两原创 2020-12-23 22:42:38 · 140 阅读 · 0 评论 -
K 个一组翻转链表 【LeetCode 25】
题目描述给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。分析这个题的思路很简单,就是模拟。翻转链表我们都知道,这个题加了一个条件,K个一组。这就带来了一些额外需要考虑的问题:怎么限制只翻转K个?可以计数(s<k),也可以使用指针判断(t!=tail)。K个一组翻转完毕后,怎么和前后的部分连接起来?翻转之前这K个的头指针就是翻转之后的尾指...原创 2020-12-23 18:56:55 · 110 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字【原地置换时间O(N)空间O(1)】
题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。普通做法: 排序时间复杂度:O(nlogn)空间复杂度:O(1)优先考虑时间:哈希可以用数组,或者map,或者任何哈希的东西。时间复杂度:O(n)空间复杂度:O(n)class Solution {public: int findRepeatNumber(vector原创 2020-10-22 10:45:17 · 162 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )分析:一个栈s1用来存放数据,另一个栈s2专门用来倒序,这毋庸置疑。最开始以为,s2倒序的元素在删除操作之后,需要再导入s1,这样插入看起来更像队列,但是下删除操作时,s1的数据还需要再用s2倒序,很多数据会重复在s1,s2中折腾,使得复杂度变得很高了。正确的.原创 2020-10-22 09:18:37 · 85 阅读 · 0 评论 -
求N个点中距离最近的点对【分治思想怎么来的】
题意:在一个平面当中分布着n个点。现在我们知道这n个点的坐标,要求找出这n个点当中距离最近的两个点的间距。番外:不知为何我第一时间想到的是距离最近的点,那他们起码是所有点中x最近,或者y最近,不可能x和y都不是最近的但是他们的距离最近,于是先按照坐标的x和y分别排一遍序,扫一遍就可以了。不能这么简单吧?自己搞了个样例试了试,发现果然理所当然想的是不对的。如有四个点:A(0,0) B(1,3) C(2,2) D(3,1),那么按照x坐标排序是A B C D的顺序,按照y坐标排序是...原创 2020-10-18 16:56:03 · 2995 阅读 · 0 评论 -
算法题:25匹马,找出最快的3匹,最少需要多少次比赛【可代码实现的思考方式】
题目描述:25匹马,找出最快的3匹,但是只有5个赛道,也就是说每次比赛只能得到5匹马的速度排序,那么最少需要多少次比赛?答案:7分析:25匹马我们用25个数字表示,数字越大表示速度越快。首先,把25匹马分为5个组,赛5场,得出每一组的排名。现在可以得到一个5*5的矩阵,其中每行都是递减的。现在每行的四五列,是无效答案,不可能进入前三名。第6场:把上述5个组的第一名A1 B1 C1 D1 E1 拿出来比较。根据每组的第一名的名次,我们把行的顺序再排序。现在我们现原创 2020-10-14 21:47:56 · 2381 阅读 · 1 评论 -
翻转字符串里的单词【LeetCode 151】
题目描述:给定一个字符串,逐个翻转字符串中的每个单词。说明:无空格字符构成一个 单词 。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。请尝试使用O(1) 额外空间复杂度的原地解法。分析:对于一个字符数组的O(1)翻转,我们可以直接用一个for循环,应该是比较好想到的。 void reverseString(vector<char>& s) { i.原创 2020-10-08 16:49:48 · 403 阅读 · 0 评论 -
随机数的应用:广告投放
网站有一个展示广告的区域,每次同时展示2个不同的广告素材,现有N个广告素材及每个广告出现的权重std::vector<int>weights[N];weight[i]代表第i个广告权重。实现该广告展示函数。例如weights[]={1,2,3,4};则总权重是10,0号广告素材出现概率是1/10,1号是2/10…如果运行1000万次该函数,则统计后0号广告出现200万次左右,1号400万次左右…(每次返回2个广告所以统计次数是2000万次)说明:1.为了保证用户新鲜感,算法需要保证...原创 2020-10-06 23:59:56 · 244 阅读 · 0 评论 -
最长回文子串【暴力、动态规划、中心扩散、马拉车算法】(LeetCode 5)
目录一、暴力法二、动态规划三、中心扩散法四、Manacher 算法求最长回文子串的方法:(子串一定是连续的,子序列不是)LeetCode题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/一、暴力法枚举子串的起点和终点,O(n^2),再用O(n)的时间判断枚举的这个子串是不是回文的。时间复杂度:O(n^3)空间复杂度:O(1)二、动态规划定义状态: p[ i ] [...原创 2020-10-05 16:42:57 · 280 阅读 · 0 评论 -
删除二叉搜索树中的节点【LeetCode 450】(两种方法的实现与比较)
目录题目描述:方法一:方法二:两种删除方法的比较:题目描述:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。要求算法时间复杂度为O(h),h 为树的高度。分析:首先我们要明确:实现的是一个函数,最终需要返回删除之后的树的根节点。由于这是一棵二叉搜索树,所以对于要删除的节点我们需要找到他并进行删除操作: 如果当前节点值比key大,则需要删除当前...原创 2020-10-04 21:47:07 · 289 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字 【LeetCode 169】
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。要求时间复杂度O(n),空间复杂度O(1)。示例:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2分析:排序的话,很明显没有用上大于N/2的这个特性,多于一半,比势均力敌要好一些,所以就想到了同归于尽的方法:碰到两个相异的数字直接抵消,反正答案最后还会剩出来。需要记录出现次数。代码:class Solution {原创 2020-10-01 16:33:55 · 278 阅读 · 0 评论 -
剑指 Offer 43. 1~n整数中1出现的次数 【LeetCode 233】
题目描述:输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。1 <= n <2^31输入: 13输出: 6解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。分析:首先发现n的范围非常大,就是是用O(n)的时间复杂度,也是会超时的,所以这个题是个数学题或者说规律题,那种暴力的方法想都不要想了。直接暴力法否定之后,那这是不是个规律题呢?于是用暴力法打了一部分数据的表格,企图去发现那个规律,打完表如下:从表格中发...原创 2020-10-01 16:18:12 · 95 阅读 · 0 评论 -
最大子矩阵和 (LeetCode面试题17.24)
题目描述:给定一个正整数、负整数和 0 组成的 N × M矩阵,编写代码找出元素总和最大的子矩阵。返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。输入:[ [-1,0], [0,-1]]输出:[0,1,0,1]解释:最大的和是0 答案可以是0 1 0 1或者1 0 1 0说明:1 <= matrix.length, matr...原创 2020-09-26 17:41:20 · 2179 阅读 · 1 评论 -
删除链表中某特定值的元素【三种方法】(LeetCode 203)
删除结点的步骤找到该结点的前一个结点 进行删除操作。具体删除方式:我们假设要删除的节点是 i ,那我们只需要找到 i 的前驱 p , 然后让 p -> next =p -> next -> next,这样就跳过了 i 这个节点,自然也就实现了删除的目的。但是这个方法需要找到被删除节点的前驱,对于头结点(也就是第一个节点)来说, 他是没有前驱的,需要特殊处理。下面介绍的方法,第一种是把头结点单独拿出来考虑,第二种是加了一个虚拟头结点,都解决了这个问题。方法一 删除头结点.原创 2020-09-24 20:31:49 · 4512 阅读 · 0 评论 -
反转链表 【指针迭代法、递归实现】(leetcode-206)
目录题目描述:迭代法:分析:实现:代码:递归法:递归结束的条件:开始翻转:后续翻转:代码:题目描述:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL迭代法:分析:如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一原创 2020-09-09 17:11:30 · 195 阅读 · 0 评论 -
leetcode-102:二叉树的层序遍历【何如打印出二维的二叉树层次遍历】
题目描述:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]分析:利用队列进行二叉树的层次遍历很简单。怎么样按照层次输出二维数组? 这个算是比较新颖。我们发现,利用队列中的元素个数可以解决这个问题。当我...原创 2020-09-06 10:42:47 · 124 阅读 · 0 评论 -
UVa101 木块问题 使用vector求解
原创 2020-08-17 17:23:58 · 157 阅读 · 0 评论 -
已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。
题目:已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数。思路:假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢?解法:该解法基于一种叫做拒绝采样的方法。主要思想是只要产生一个目标范围内的随机数,则直接返回。如果产生的随机数不在目标范围内,则丢弃该值,重新取样。由于目标范围内的数字被选中的概率相等,这样一个均匀的分布生成了。显然ran...转载 2020-07-17 16:41:10 · 479 阅读 · 0 评论 -
POJ 3320 尺取法(使用map,set)
http://poj.org/problem?id=3320题意:为了准备考试,Jessica开始读一本很厚的课本。要想通过考试,必须要课本上每个知识点看一遍。这本书一共有P页,第i页恰好有一个知识点ai(每个知识点都有一个编号),同一个知识点可能被多页反复提到。所以她想阅读连续的一些页把书本中所有的知识点全覆盖到。给定每页写到的知识点,求出阅读的最少页数。因为所求区间为连续,所以我们使用...原创 2018-07-30 18:24:38 · 230 阅读 · 1 评论 -
POJ 3276 Face The Right Way【开关问题】
题目链接:http://poj.org/problem?id=3276题意:有n头牛排成一列,面朝前(F)或者面朝后(B)。约翰想让所有的牛都面朝前,他每次可以反转连续的k头牛。求为了让所有牛都面朝前需要最少反转的次数M和对应的最小连续长度K值。题目分析:我们首先可以想到n^3的暴力,即枚举反转长度K,n^2反转。 超时是一定的,但是这个想法可以给我们一些启发。首先,枚举反转长度K这个...原创 2018-08-01 16:39:16 · 274 阅读 · 0 评论 -
POJ 3279 反转问题
题目链接:http://poj.org/problem?id=3279题意:有一个n*m的格子,每个格子要么为0,要么为1。我们需要把所有的格子都反转成0,每反转一个格子,它上下左右的格子都会跟着反转。求最少的翻转次数,并输出对应的翻转情况。有多个解时,输出字典序最小的一组。题目分析:首先我们发现,N,M<=15,数据范围很小,并且翻转不分先后,对一个格子翻转两次,那么相当于没有反转...原创 2018-08-04 11:31:08 · 270 阅读 · 4 评论 -
POJ 1127 并查集+几何
题意:桌子上放着n根木棍,木棍的两端坐标分别是(Pix, Piy)和(Qix, Qiy)。给定m对木棍(ai, bi),请判断没对木棍是否相连。当两根木棍之间有公共点时,就认为它们是相连的。通过相连的木棍间接的连在一起的两根木棍也认为是相连的。分析:木棍就是二维平面上的线段,只有能够判断线段是否相交,那么建图以后就可以轻松的进行连接性判断。那么,应该如何判断两条线段是否相交呢?首先会想...原创 2018-08-04 20:00:03 · 213 阅读 · 0 评论 -
POJ 2932 平面扫描
题意:平面上有N个两两没有公共点的圆,i号圆的圆心在(xi,yi),半径为ri。求所有最外层的,即不包含于其他圆内部的圆。分析:在几何问题中,我们经常利用平面扫描技术来降低算法的复杂度。所谓平面扫描,是指扫描线在平面上按给定的轨迹移动的同时,不断根据扫描线扫过的部分更新信息,从而得到整体所要求得结果的方法。扫描的方法,既可以从左向右平移与y轴平行的直线,也可以固定射线的端点逆时针转动。...原创 2018-08-04 20:06:58 · 425 阅读 · 0 评论 -
POJ 2992 求分子个数
题目:http://poj.org/problem?id=2992题意:求解出组合数C(n,k)的约数个数储备知识:利用分解质因数求因子个数如果 n=p1^a1*p2^a2...pk^ak;那么因子个数为 (a1+1)*(a2+1)*...*(ak+1)第一种思路:将组合数按照分式形式把每个数进行分解,然后上下约分,最后求解。,但是死活超时。。。。超时代码:#...原创 2018-08-05 13:17:21 · 166 阅读 · 0 评论 -
POJ 2484博弈——对称法
题目链接:http://poj.org/problem?id=2484题意:Alice和Bob玩游戏,从一堆圆环形排列的硬币中拿硬币,每次可以拿一个或者两个,但必须拿连续的(两个中间有空位也视为不连续),Alice先手,给定硬币个数,问谁赢。题解:当n=1或者n=2时,Alice可以一下子取走所有的硬币,获胜。当n>=3时,Alice不管取多少硬币,她会把原来的圆环搞出一个缺...原创 2018-08-07 08:40:02 · 247 阅读 · 0 评论 -
HDU 1525 博弈 通俗易懂的详细解释
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1525题意:两人博弈,给出两个数a和b,较大数减去较小数的任意倍数,结果不能小于0,将两个数任意一个数减到0的为胜者。题解:假设a大于b,若 a=b,当前玩家胜利。若 a%b=0,当前玩家胜利。若 a>2*b,当前玩家能决定是让自己取(b,a%b)还是让对手取(b,...原创 2018-08-07 09:12:11 · 246 阅读 · 0 评论 -
POJ 1704 阶段博弈
题目链接:http://poj.org/problem?id=1704题意:从左到右有一排石子,给出石子所在的位置。规定每个石子只能向左移动,且不能跨过前面的石子。最左边的石子最多只能移动到1位置。每次选择一个石子按规则向左移动,问先手是否能赢。题解:我们把棋子按位置升序排列后,从后往前把他们两两绑定成一对。如果总个数是奇数,就把最前面一个和边界(位置为0)绑定。在同一对棋子中,如...原创 2018-08-07 09:22:52 · 141 阅读 · 0 评论 -
HDU 5514容斥定理
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5514题意:有一堆青蛙,一开始都在0点,然后有一堆圈成一圈的石子,石子的编号是从0~m-1。青蛙只能顺时针跳,第i只青蛙可以一次跳a[i]格,然后所有青蛙都这样一直跳下去然后问你,这些青蛙踩过的石子的编号和是多少?题解:首先,对于第i只青蛙,他跳过的格子,一定是k*gcd(a[i],m)...原创 2018-08-08 17:31:39 · 138 阅读 · 0 评论 -
不用加减乘除号完成两个整数的加法。
描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。两个整数位num1、num2。分析:在计组中学过的知识:半加器、全加器中:两个二进制的相加结果是用一个异或门实现的;两个二进制的进位结果是用一个与门来实现的。也就是说:在不考虑进位的情况下,两个数二进制加法可以直接用异或门来实现,假设得出的无进位加法结果为answer。现在只需要再把进位的情况考虑进去:进位的结果可以用与门来计算得出,假设为p,并且因为是进位,所以还需要左移一位。.原创 2020-07-05 16:41:19 · 306 阅读 · 0 评论 -
牛客网 剪绳子 为什么可以用递归?
题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。思考在潜意识中,有这么一个小学或者初中数学题,给你一根长度一定的绳子,如果围成一个正方形,那么他的面积一定比围成长方形要大,最大的面积是围成圆形。不知道为什么,看到这个题目想到了这个。原创 2020-07-12 21:18:38 · 208 阅读 · 0 评论