
刷题
此专栏会记录平常做的一些面试题,包括剑指offer、牛客网、leetcode等各大网站上的面试题。
WolfOnTheWay
我们的目标就是做大,做强,定创辉煌!
展开
-
LeetCode题目总结:排序技巧||题目汇总
在这里将leetCode中能用排序思想解决的题目加以汇总,以供大家参考。原创 2020-10-04 18:11:53 · 1077 阅读 · 0 评论 -
剑指offer刷题————不用加减乘除做加法
问题重述:题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、X、/四则运算符号。思路分析:这里参照牛客网上的一篇题解,写的非常好。代码实现:class Solution {public: int Add(int num1, int num2) { int sum,array; do { sum = num1^num2; array = num1&原创 2020-08-15 13:00:01 · 198 阅读 · 0 评论 -
剑指offer刷题————求1+2+……+n
问题重述:题目:求1+2+……+n,要求不能使用乘除法,for、while、if、else、switch、case等关键字及条件判断语句(A?B:C;)。思路解析:要求不能使用乘除和一些语句,因此我们可以设计递归思路,并且用位运算符来判断是否到达递归终止的条件。另外,我们可以用C++构造函数来设计出一种思路,具体见代码。代码实现:class Solution {public: int Sum_Solution(int n) { int s原创 2020-08-14 21:43:30 · 256 阅读 · 3 评论 -
剑指offer刷题————圆圈中最后剩下的数字
目录问题重述:思路解析_1:代码实现_1:思路解析_2:代码实现_2:问题重述:题目:0,1,……,n-1这n个数字排成一个圆圈。从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。思路解析_1:用一个链表来存储元素,当遍历到链表尾部的时候,让迭代器再次指向头部,由此形成一个环。我们就在链表中去遍历,每次遇到第m个数字,删除即可,直至链表中剩下最后一个元素。代码实现_1:class Solution {public: i.原创 2020-08-14 00:18:53 · 145 阅读 · 0 评论 -
剑指offer刷题————扑克牌顺子
问题重述:题目:从扑克牌中随机抽取张牌,判断是不是一个顺子,即这张牌是不是连续的,2~10为数字本身,A为1,J为11,Q为12,K为13,而大王小王可以看成任意的数字。思路解析:首先我们认为大王和小王为数字0,首先我们统计0的个数,然后将数组排序,并且判断中间缺的数的个数比0的个数多还是少,如果比0的个数多,那么就不是顺子,具体思路可以参见下面代码。代码实现:class Solution {public: bool IsContinuous( vector<int&g原创 2020-08-13 23:17:43 · 210 阅读 · 0 评论 -
华为机试题:多线程
问题重述:这里考虑原子整型,但是牛客网中原子整型出错,因此改为互斥锁,还是出错,说什么没有链接相应的文件。因此将此问题在此记录。思路解析:完全可以用两个变量去控制,这里考虑原子整型,但是牛客网中原子整型出错,因此改为互斥锁,还是出错,说什么没有链接相应的文件。因此将此问题在此记录。思路详见代码:代码实现:# include<thread># include<iostream>#include<atomic>#include<vect原创 2020-08-13 11:26:36 · 478 阅读 · 0 评论 -
剑指offer刷题————n个骰子的点数
问题重述:题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。思路解析:要想求出n个骰子的点数和,可以先把n个骰子分为两堆:第一堆只有一个,另一堆有n-1个。单独的那一个可能出现从1到6的点数。我们需要计算从1到6的每一种点数和剩下的n-1个骰子来计算点数和。接下来把剩下的n-1个骰子还是分成两堆。第一堆只有一个,第二队有n-2个。我们把上一轮那个单独的骰子的点数和这一轮单独的骰子的点数和相加,再和剩下的n-2个骰子来计算点数和。分析到这里,我们不原创 2020-08-12 18:29:21 · 233 阅读 · 0 评论 -
剑指offer刷题————翻转单词顺序 VS 左旋转字符串
题目1问题重述:题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student",则输出"student. a am I"。思路解析:对于这个题目,我们可以先将字符串整体进行翻转,然后再在每个单词的内部进行翻转,即得到我们想要的答案,具体见代码。代码实现:class Solution {public: string ReverseSentence(string str) {原创 2020-08-10 21:28:37 · 191 阅读 · 0 评论 -
剑指offer刷题————和为s的两个数字VS和为S的连续正数序列
题目1:问题重述:题目:输入一个递增排序的数组和一个数字s。在数组中查找这两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。例如:输入数组{1,2,4,7,11,15}和数字14。由于4+11=15,因此输出4和11。思路解析:我们可以这样,设置两个指针head和tail,head在数组头部,tail在数组末尾。由于数组是递增的,如果两个head对应的值加上tail对应的值如果小于s,那么只能head向后遍历,如果大于s,只能tail向前遍历,按照这种逻辑搜索,直原创 2020-08-09 22:03:14 · 153 阅读 · 0 评论 -
剑指offer刷题————数组中只出现一次的数字
问题重述:题目:一个整型数组里面除了两个数字之外,其他的数组都只出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。例如:输入数组{2,4,3,6,3,2,5,5}思路解析:首先我们知道,两个相同的数字进行亦或操作的结果为0,而0与任何数组进行亦或操作的结果为原数。那么,如果数组中只有一个只出现一次的数的话,我们遍历数组,进行亦或操作,即可得到结果。吸取经验,我们继续将所有的数都进行亦或操作,由于数组中有两个只出现一次的数字,因此亦或的结果原创 2020-08-09 21:50:12 · 284 阅读 · 0 评论 -
剑指offer刷题————二叉树的深度
问题1:二叉树的深度问题重述:题目:输入一颗二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路解析:此题的思路较简单,我们每次递归得出左子树和右子树的深度,然后返回其中较大值。详见代码代码实现:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x),原创 2020-08-09 19:57:55 · 179 阅读 · 0 评论 -
剑指offer刷题————数字在排序数组中出现的次数
问题重述:题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和3,由于3在数组中出现了4次,因此输入4。思路接下:大家的首先反应可能是用二分法先找到一个数字,假设为k,然后在从此位置处向前和向后搜索k,此方法的时间复杂度其实还是O(n),显然是不萌满足要求的。因此我们可以用二分法找到一个k和最后一个k,即得到了所有k的数量。找到第一个k的思路如下:首先用二分法找到k,然后判断mid-1处是不是k,如果不是,那么mid就是k第一次出现的位置,如原创 2020-08-06 23:04:23 · 165 阅读 · 0 评论 -
剑指offer刷题————两个链表的第一个公共结点
问题重述:题目:输入两个链表,找出它们额第一个公共结点。思路接下:我们假设,如果两个链表中有相同的结点(公共结点),那么从公共结点之后(包括公共结点),两个链表是一模一样的。因此可以这样。先求出两个链表的长度,然后将长的链表遍历到和短的链表一样长的地方,然后同时向后遍历并进行比较,那么第一次相等的地方就是两个链表的第一个公共结点。代码实现:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) :原创 2020-08-06 21:41:45 · 171 阅读 · 0 评论 -
剑指offer刷题————数组中的逆序对
问题重述:题目:在数组中的两个数字,如果前面的一个数字大于后面的一个数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的所有逆序对的总数。思路解析:首先,可以先将原数组复制一份。然后用两个指针分别指向两个数组的末尾,并每次比较两个指针指向的数字。如果第一个数组中的数字大于第二个素组中的数字,则构成逆序对,并且逆序对的数目等于第二个子数组中剩余数字的个数。如果第一个数组中的数字小于或等于第二个数组中的数字,则不构成逆序对。每一次比较的时候,都将较大的数字从后往前复制到一个辅助数组中去,原创 2020-08-06 15:53:29 · 153 阅读 · 0 评论 -
LeetCode题目总结:双指针技巧||题目汇总
以下内容参考guthub:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20题解%20-%20双指针.mdleetcode上的题目大多数都是面试的高频题,事实上,我们不可能记住每个题目,因此,将相同类型的题目加以总结是最有效的办法。以下几个题目都是利用双指针的技巧来进行解决,题目难度从浅到深,因此,我仅给出代码。题目列表:两数之和Ⅱ-输入有序数组 平方数之和 反转字符串中的元音字母 验证回文字符串Ⅱ 合并原创 2020-08-01 16:14:43 · 401 阅读 · 0 评论 -
剑指offer刷题————第一个只出现依次的字符
问题重述:题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出b.思路解析:我们可以建立一个hash表,大小位256(因为char有256中可能),然后遍历字符串,在hash表中,以遍历到的字符的ASCII值作为下标,将对应位置的值加1。然后第二次从头遍历字符串,判断以当前字符串的ASCII值位下标,在hash表对应位置的值是否为1,如果为1,返回当前字符。代码实现: char FirstNotRepeatingChar(string str) {原创 2020-07-31 15:27:28 · 128 阅读 · 0 评论 -
剑指offer刷题————丑数
问题重述:题目:我们把只包含因子2、3和5的数称作为丑数,求按照从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含了因子7,习惯上我们将1称作为第一个丑数。思路解析:根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5得到的结果(1除外)。因此我们可以创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2、3或者5得到的。这种思路的关键在于怎样确保数组里面的丑数是已经排好序的。假设数组中已经有若干个排好的序的丑数存放在数组中,并且把前面已有的最大的丑原创 2020-07-27 19:50:36 · 203 阅读 · 0 评论 -
剑指offer刷题————把数组排成最小的数
问题重述:题目:输入一个正整数数组,把数组里所有的数组拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,例如输入数组{3,32,321},则打印出着3个数字能排成的最小数字321323。思路解析:首先,因为拼接起来的数可能会超出范围,因此用字符串来存储。我们需要一个最小的数,细想一下可知,如果有两个字符串a,b,如果a + b < b + a, 显然我们希望a排在b的前面,因为a排在前面可以使结果更小。于是我们就自定义排序规则,使得vector中字符串都满足如上规则,那么最后.原创 2020-06-30 10:49:38 · 2841 阅读 · 0 评论 -
剑指offer刷题————从1到整数n中1出现的次数
问题重述:题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12着些整数中包含1的数字有1,10,11,12,1一共出现了5次(11中有两个1).思路解析:这道题的解析下面网址给出的解析非常简单明了,大家可以参阅。https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-原创 2020-06-28 22:26:26 · 158 阅读 · 0 评论 -
剑指offer刷题————连续子数组的最大和
问题重述:题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和为18.思路解析:动态规划方法在解决此问题的时候非常高效。状态定义:dp[i]表示以i结尾的连续子数组的最大和。所以最终要求dp[n-1]状态转移方程:dp[i] = max(array[i], dp[i-1]+a原创 2020-06-26 21:11:40 · 195 阅读 · 0 评论 -
剑指offer刷题————最小的k个数
问题重述:题目:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个主子,则最小的4个数字是1、2、3、4。思路解析:在不改变原数组的基础上,我们可以建立一个大根堆,然后将数组的前k个数字插入到大根堆中。然后从位置k处开始继续遍历数组,依次与堆顶元素比较,如果这个元素小于堆顶元素,那么我们剔除堆顶元素,并且将此元素插入到堆中。当遍历完整个数组之后,堆中的元素就是最小的k个数。代码实现:class Solution {public: vector&l原创 2020-06-25 15:09:30 · 175 阅读 · 0 评论 -
剑指offer刷题————数组中出现次数超过一半的数字
问题重述:题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字。不存在则返回0.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。思路解析:数组中有一个数字出现的次数超过了数组长度的一半,也就是说它出现的次数比其他所有的数字出现的次数和还要多。因此我们可以卡奥率在遍历数组的时候保存两个值;一个是数组中的一个数字,一个是次数。当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加原创 2020-06-24 22:38:58 · 206 阅读 · 0 评论 -
剑指offer刷题————字符串的排列
问题重述:题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。思路解析:可以将字符串看成两部分,第一个字符看成第一部分,后面的字符看成第二部分。并且依次将第二部分的第一个字符和第一部分交换。同时对第二部分递归的进行操作即可。由于题目并没有说明字符都是不重复的,因此在得到结果之后要进行去重,才能够进行返回。详见代码。代码实现:class Solution {pub原创 2020-06-23 21:13:54 · 239 阅读 · 0 评论 -
剑指offer刷题————二叉搜索树与双向链表
问题重述:题目:输入一个二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整书中结点指针的方向。如下图:思路解析:首先我们知道二叉搜索树的中序遍历是有序的,因此我们可以先得到二叉搜索树的中序遍历序列,然后去修改指针即可。代码实现:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), l原创 2020-06-21 20:07:06 · 192 阅读 · 0 评论 -
剑指offer刷题————复杂链表的复制
目录问题重述:思路解析:代码实现:问题重述:题目:请实现一个函数来复制一个复杂链表。在复杂链表中,每个节点除了有一个next指针指向下一个节点外,还有一个random指针,指向链表中的任意节点或者NULL。思路解析:假设有一个链表如下:其中虚线表示random指针,我们可以在每个节点后面添加一个复制品。如下:接下来来看random指针,如图所示,由于A的random指针指向了C,因此C`的random指针应该指向C`。连接好random指针后,我们可.原创 2020-06-02 22:29:44 · 171 阅读 · 0 评论 -
剑指offer刷题————二叉树中和为某一值得路径
目录问题重述:思路解析:代码实现:问题重述:题目:输入一颗二叉树的根节点和一个整数,打印出二叉树节点值得和为输入整数得所有路径。路径定义为从树得根节点开始往下一直到叶节点所经过得节点形成一条路径。思路解析:首先,注意一个雷区,题目要求一条路径是从根节点到叶节点,因此,满足条件得路径一定会包含一个叶节点。由于要求是从根到叶节点得路径,因此可以想到利用二叉树的先序遍历,每往下遍历一步,就记录下路径,同时在叶子节点处判断是否满足条件,当从低往上回溯的时候,应该将路径序列中的最.原创 2020-06-02 09:47:34 · 280 阅读 · 0 评论 -
剑指offer刷题————二叉搜索树的后序遍历序列
问题重述:题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false.假设输入的数组任一两个数组都不相同。思路解析:首先这个数组是搜索二叉树的后序遍历,因为搜索二叉树满足左小右大的规则,并且后序遍历中最后一个遍历的是根节点,因此,我们能根据最后一个数字将数组分为两部分,前面的一部分都比最后一个节点小,后面的一部分都比最后一个节点大。因此,整体思路是这样的:将最后一个数字作为根节点提出来,从头开始和这个数字进行比较,当遇到第一个比根节点大的数原创 2020-05-29 17:43:08 · 243 阅读 · 0 评论 -
剑指offer刷题————从上往下打印二叉树
问题重述:题目:从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。思路分析:这个问题很简单,即使二叉树的层次遍历。代码实现:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: v原创 2020-05-21 20:38:17 · 183 阅读 · 0 评论 -
牛客网错题笔记:C/C++专项 :1-10
1 32位平台上struct{unsigned char a,int b,short c}s;请问s的起始地址下面说法正确的是哪一个?()正确答案应该是四字节对齐,因为起始地址应该按照结构体中最大类型的大小对齐。2 请问以下说法哪个是正确的:对于选项A,如果定义了有参数的构造函数时,编译器不再提供无参数的默认构造函数。选项B:拷贝构造函数可以定义为删除的,即为没有。选项D;析构函数只能有一个,因此,正确答案为C3 浮点数算数标准是以下哪一个?A:posix ...原创 2020-05-14 22:46:40 · 13434 阅读 · 0 评论 -
剑指offer刷题————栈的压入、弹出序列
1.问题重述题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是压栈序列的弹出序列2.思路解析这道题目的思路很明确,我们就建立一个栈,然后让入栈序列先入栈一个,然后看栈顶元素是否与弹出序列的第一...原创 2020-04-17 10:53:14 · 233 阅读 · 0 评论 -
剑指offer面试题总结||所有习题||思路解析||代码实现||c/c++(已完结)
剑指offer———重建二叉树剑指offer———二维数组中的查找剑指offer————用两个栈实现队列剑指offer————替换空格剑指offer————从尾到头打印链表剑指offer————旋转数组的最小数字剑指offer刷题————斐波那契数列剑指offer刷题————二进制中1的个数剑指offer刷题———数值的整数次方剑指offer刷题———打印1到最...原创 2020-04-15 10:19:31 · 437 阅读 · 0 评论 -
剑指offer刷题———包含min函数的栈
1.问题重述题目:定义栈的数据结构,请在该类型中实现一个能够得到全栈最小元素的min函数,同时要求,调用min、push、pop的时间复杂度都为O(1);2.思路解析本题目要求在栈中有一个min函数能够得到全栈最小的元素,同时还要保证栈的FILO的特性,因此这个最小的元素肯定要保存在外部,要不然会破坏栈的FILO特性。所以我们可以创建两个栈来实现题目要求的数据类型,一个栈_data...原创 2020-04-15 10:12:12 · 203 阅读 · 0 评论 -
剑指offer刷题———顺时针打印矩阵
问题重述:题目:输入一个矩阵,按照从外向里以顺时针的顺序打印出没一个数字。例如输入下面矩阵:则依次打印出:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路解析:可以将矩阵看作几个环来打印:如下:每次都从环的左上角开始打印,我们会发现左上角元素的横坐标和纵坐标是相同的,我们记为(start,start),记矩阵的横纵坐标分别为r和c。...原创 2020-03-16 10:32:50 · 186 阅读 · 0 评论 -
剑指offer刷题———二叉树的镜像
问题重述:题目:二叉树的镜像请完成一个函数,输入一个二叉树,该函数输出它的镜像;二叉树的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};思路解析:我们先来看看镜像后的二叉树是什么样子的。如下:如上图,右边是左边二叉树的...原创 2020-03-13 17:09:46 · 197 阅读 · 0 评论 -
剑指offer刷题———树的子结构
问题重述题目:输入两颗二叉树A和B,判断B是不是A的子树,二叉树的节点定义如下struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};思路解析:在这个问题中,我们要确保子树中的整体结构都能找到,因此先要在树A中找到和树B根节点值一样的节点,然后比较树...原创 2020-03-12 10:26:24 · 137 阅读 · 0 评论 -
剑指offer刷题———合并两个排序的链表
问题重述题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。链表结构的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};思路解析这道题经常会被问到,但是还是非常简单的。我们只需要从两个链表的头节点开始遍历,取较小的加入到新链表上即可,可参照下图所示的拼接过程。...原创 2020-02-26 14:29:13 · 375 阅读 · 0 评论 -
剑指offer刷题———链表中倒数第K个结点
问题重述:题目:链表中倒数第K个结点输入一个链表,书v胡链表中倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第一个结点。例如一个链表有6个结点,从头开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。思路解析:有一种最直接的方法是将链表遍历两遍,第一遍得到链表长度,第二遍去找第K个结点。这种方式不免太麻烦。我们可以设置...原创 2019-12-03 22:29:34 · 160 阅读 · 0 评论 -
剑指offer刷题———调整数组顺序使奇数位于偶数前面
问题重述:题目:输入一个整数数组,实现一个函数来调整数组中的数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。思路解析:题目只是要求将奇数置于前,偶数置于后。我们可以设置两个指针分别位于数组的begin和end处,让前面的指针向后搜索,停在遇到的第一个偶数处,让后面的指针向前搜索,停在遇到的第一个奇数处。让后两个指针处的内容进行交换,重复搜索,直至两个指针相遇...原创 2019-11-17 19:33:31 · 170 阅读 · 0 评论 -
剑指offer刷题———在O(1)时间内删除链表结点
问题重述:题目:在O(1)时间内删除链表结点。给定单链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点。链表结点与函数的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted);思...原创 2019-11-11 18:40:57 · 198 阅读 · 0 评论 -
剑指offer———二维数组中的查找
问题重述:题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序。请完成一个函数,输入这样的一个二维数组和整数,并判断数组中是否含有该整数。假设二维数组如下所示:解题思路:假设要查找数字7是否在上述二维数组中,我们可以采取下述的方法:从右上角开始进行比较,根据大去行,小去列的原则进行。编码实现:int FindNum(in...原创 2019-05-28 09:43:47 · 161 阅读 · 0 评论