
剑指offer刷题c++/python
用c++/python刷剑指offer算法题
别说话写代码
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指offer-面试题:字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路:注意这个题目可能有 重复的数字,比如aa的排列就是[aa],不是[aa,aa],所以在递归 时需要判断。还有要在牛客oj上通过...原创 2019-03-18 21:23:59 · 297 阅读 · 0 评论 -
剑指offer 面试题:连续子数组最大和
题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和...原创 2019-03-09 11:03:29 · 246 阅读 · 0 评论 -
剑指offer 面试题:反转链表
题目:输入一个链表,反转链表后,输出新链表的表头。思路:把每个节点摘下来插入到头结点的位置/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* Rever...原创 2019-03-09 10:17:32 · 210 阅读 · 0 评论 -
剑指offer 面试题:二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:用位运算,n&(n-1)意思就是讲n的最后一个位置的1变为0class Solution {public: int NumberOf1(int n) { int count=0; while(n) { count...原创 2019-03-09 09:52:41 · 235 阅读 · 0 评论 -
剑指offer 面试题:链表中倒数第k个节点
题目:输入一个链表,输出该链表中倒数第k个结点。思路:让一个指针先走k-1步,然后另一个指针从头开始,两个指针一起走,当第一个指针结尾,第二个指针就到末尾了。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solu...原创 2019-03-09 09:48:57 · 320 阅读 · 0 评论 -
剑指offer 面试题:树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:将要匹配的子树根节点一个个在树中查找,子树根等于当前树某节点,则一一匹配每个值,否则就遍历树中所有节点/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(in...原创 2019-03-09 09:35:31 · 193 阅读 · 0 评论 -
剑指offer 面试题:两个队列模拟一个栈
两个栈模拟一个队列我们知道了:https://blog.csdn.net/qq_21997625/article/details/88088230。就是用一个栈使用做入队操作,而另外一个栈 始终做出队 操作,当出队操作的栈元素为空,就将入队的栈元素全部 转移过来。思路:这个题目是两个 队列模拟一个栈,比如有两个队列q1和q2.入 栈操作就比如往q1里面入,入完之后如果想出,那就将q1中前面元素...原创 2019-03-06 10:03:57 · 327 阅读 · 0 评论 -
剑指offer 面试题:二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路。题目要求就是将left变为前向指针,right变为后向 指针。那就用递归方法来做,二叉搜索树中序有序,那就 用一个last指针指向根节点左子树最右边 节点,然后将last和根节点连接起来,然后将last 指向根节点,然后遍历右子树。/*struct TreeNo...原创 2019-03-04 13:03:22 · 200 阅读 · 0 评论 -
剑指offer 面试题:机器人的运动范围
题目:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路:用一个二维数组表示每个位置是否被 访问,...原创 2019-03-04 11:05:11 · 197 阅读 · 0 评论 -
剑指offer 面试题:圆圈中最后剩下的数字(约瑟夫环)
题目:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直...原创 2019-03-04 10:29:39 · 342 阅读 · 4 评论 -
剑指offer 面试题:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:已知一个入栈序列和出栈序列。先定义一个栈,然后分 几种情况:1)如果下一个弹出的数...原创 2019-03-03 15:45:03 · 237 阅读 · 0 评论 -
剑指offer 面试题:两个栈实现一个队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:两个栈s1和s2,入栈只往s1中入,出栈从s2中出,若出的时候s2空了,将s1所有元素放入s2中。这里就能通过提交。其实这里还要有 更详细的 判断,比如往s1中插入的时候 如果s1满了怎么办,这里没写class Solution{public: void push(int nod...原创 2019-03-03 14:58:17 · 248 阅读 · 0 评论 -
剑指offer 面试题:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:二叉 搜索树的中序遍历序列是有序的。也就是根节点值大于左子节点值,小于右子节点值。那其后序遍历序列是先遍历左子节点,再遍历 右子节点。那就是先拿出来根节点(后序遍历最后一个元素),从前往后找如果元素都比根小,那就是左子树 的节点,如果接下来的都比...原创 2019-03-03 14:52:52 · 248 阅读 · 0 评论 -
剑指offer 面试题:二叉树种和为某一值的路径
题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:再写一个函数,用一个值cur 保存根节点到当前路径的和,如果cur==n并且当前是叶子节点,则算 一种成功情况。遍历完所有情况就行了。/*struct TreeNode {...原创 2019-03-03 13:29:12 · 131 阅读 · 0 评论 -
剑指offer 面试题:数值的整数次方
题目:实现函数double power(double base,int exponent),求base的exponent次方。不能使用库函数,同时不需要考虑大数问题。思路:这个题目可以求某个数字的 平方根,立方根。思路就是先判断不合法输入,也就是0分之1,base=0且exponent<0的情况。然后判断exponent是否<0,如果小于0其实可以先算-exponent的 情况(也...原创 2019-03-03 13:05:27 · 914 阅读 · 0 评论 -
剑指offer 面试题:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:二叉树先序是根左右,中序 是左根右。所以先找到二叉树的根节点,然后中序遍历根节点左边就是左子树,右边就是右子树 (补充中序遍历与其他任何一种遍历都能...原创 2018-12-29 22:42:32 · 280 阅读 · 0 评论 -
剑指offer 面试题:从尾到头打印链表
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路:有多种放法。(1)先反转链表,再打印链表。(2)使用栈。(3)先入队列,然后翻转队列/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* ...原创 2018-12-29 21:59:27 · 253 阅读 · 0 评论 -
剑指offer 面试题:之字形打印二叉树(BFS) c++
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:与 上一题分行打印二叉树https://blog.csdn.net/qq_21997625/article/details/84634299 一样。不过多了个标志位。用bfs,然后逐行打印,设个标志flag翻转/*struct ...原创 2018-11-29 16:57:56 · 256 阅读 · 0 评论 -
剑指offer 面试题:二叉树打印多行(BFS) c++
题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:用bfs,借助队列操作。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), ri...原创 2018-11-29 15:58:21 · 213 阅读 · 0 评论 -
剑指offer 面试题:字符串转整数 c++
题目:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。思路:如果要写bugfree,就要判断空指针,空字符串,正负号,溢出等。这里在线编程只需要通过编译即可class Solution {public: int St...原创 2018-11-27 09:47:49 · 283 阅读 · 0 评论 -
剑指offer 面试题8:二叉树的下一个节点 c++
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解析:三种情况:1.若节点有右子树,中序下一个就是 右子树最左孩子节点 2.若无右子树,且当前节点是父节点的左子节点,下一个就是父节点 3.无右子树,且当前节点是父节点的右子节点,那下一个就是 父节点的父节点,一直往上找, 一直找到根,说明当时节点是...原创 2018-11-20 12:47:25 · 560 阅读 · 0 评论 -
剑指offer 面试题18:删除链表中的重复节点 c++
本题有两种第一题:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->3->4->5 ( 只是去掉了重复节点)思路:两个指针 一前一后,若前后相等,删掉后面的class Solution {public...原创 2018-11-19 16:29:07 · 1237 阅读 · 4 评论 -
剑指offer 面试题19:正则表达式匹配
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配class Solution {public: bool matchcore(char ...原创 2018-11-15 16:53:42 · 264 阅读 · 0 评论 -
剑指offer 面试题20:表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。可以用A[.[B]][e|EC]或者.B[e|EC]表示,其原创 2018-11-15 16:42:47 · 178 阅读 · 0 评论 -
剑指offer 面试题23:链表中环的入口节点
题目:一个链表中包含环,请找出该链表的环的入口结点。解法:1.使用哈希表,遍历整个链表,并将链表结点存入哈希表中(这里我们使用容器set),如果遍历到某个链表结点已经在set中,那么该点即为环的入口结点2.如果链表存在环,我们无需计算环的长度n,只需在相遇时,让一个指针在相遇点出发,另一个指针在链表首部出发,然后两个指针一次走一步,当它们相遇时,就是环的入口处。法一:clas...原创 2018-11-15 20:22:30 · 274 阅读 · 0 评论 -
剑指offer 面试题28:对称的二叉树 c++
题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。(要想象一下他的结构)思路:递归判断,左子树的左子树和右子树的右子树比较,左子树的右子树和右子树的左子树比较,若相等则是,否则不是。class Solution {public: bool isSym(TreeNode* left,TreeNode *right)...原创 2018-11-19 16:55:28 · 257 阅读 · 0 评论 -
剑指offer 面试题35:复杂链表的复制 三种解法 c++
题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个pNext指针指向下一个结点之外,还有一个pSibling指向链表中的任意结点或者NULL。结点的定义如下:struct ComplexListNode{ int label; ComplexListNode* pNe...原创 2018-11-23 13:02:22 · 1807 阅读 · 0 评论 -
剑指offer 面试题37:序列化二叉树 c++
题目:请实现两个函数,分别用来序列化和反序列化二叉树。思路:用dfs的思想,用前序遍历来序列化和反序列化二叉树参考思路:https://blog.csdn.net/u011475210/article/details/78889876(1)用vector,不用考虑逗号操作(2)用string(3)用stringstream,代码更加简洁 基于vector代码 如下...原创 2018-11-29 15:16:02 · 1080 阅读 · 3 评论 -
剑指offer 面试题41:数据流中的中位数 c++
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。思路:数据流的中位数最好使用两个堆,这样可以动态维护插入和获得中位数的过程。可以使用一个大顶堆和一个小顶堆, 中位数左边是 大顶堆,放比中位数小的元素,中位数右边放小顶堆,放比中位数大的元素。如果当前...原创 2018-11-29 12:46:46 · 1028 阅读 · 0 评论 -
剑指offer 面试题42:左旋转字符串vs翻转单词顺序 c++
题目:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:通过旋转, 比如题目中S=”abcXYZdef”,第一次全部旋转S="fedZYXcba",第...原创 2018-11-21 11:20:41 · 296 阅读 · 0 评论 -
剑指offer 面试题43:整数中1出现的次数(1~n整数中1出现的次数)
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:参考https://blog.csdn.net/yi_afly/art...原创 2018-11-23 14:32:08 · 401 阅读 · 0 评论 -
剑指offer 面试题49:丑数
题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:用一个数组,三个指针,index2,index3和index5,给每个元素乘以2,3,5看哪个刚好比当前nextindex位置的元素大,就放进来class Solution {public:...原创 2018-11-19 16:34:44 · 225 阅读 · 0 评论 -
剑指offer 面试题50:字符流中第一个只出现一次的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。解法: 使用哈希表occurance[256] ; 初始化occurance为-1,当遇到某个字符并且字符的occurance[ch]==-1时候,将其置为字符出现的位置i...原创 2018-11-15 18:10:42 · 555 阅读 · 0 评论 -
剑指offer 面试题54:二叉搜索树的第k大节点
题目:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路:二叉 搜索树的中序遍历是有序的,意思是找第k个数/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeN...原创 2018-11-23 15:27:13 · 367 阅读 · 0 评论 -
剑指offer 面试题57:和为s的两个数字vs和为s的连续正数序列 c++
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。思路:两个 指针,start从前往后遍历,end从后往前遍历,如果当前前后之和大于s,end--,如果当前前后之和小于s,start++,这样能找出乘积最小的和为s的两个数class Solution {public: vector<int...原创 2018-11-21 10:12:43 · 292 阅读 · 0 评论 -
剑指offer 面试题56:数组中只出现一次的数字
题目:在一个整数数组中,除了一个数之外,其他的数出现的次数都是两次,求出现一次的数,要求时间复杂度尽可能的小。例如数组{1,2,2,3,3,6,6},出现一次的数是1.思路:用 异或操作,相同为0相异为1,对所有元素异或然后得到的 结果就是要求的唯一一个只出现一次的数字int getonlyone(vector<int> data){ int k=0; fo...原创 2018-11-22 23:40:47 · 256 阅读 · 0 评论 -
剑指offer 面试题59:队列最大值 滑动窗口最大值 c++
题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1...原创 2018-11-27 15:22:02 · 576 阅读 · 0 评论 -
剑指offer 面试题61:扑克牌中的顺子 c++
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而 大小王可以看成 任意数字思路:以大小王为0,0可以代替任何数字。先对序列进行排序,然后算数组中0的个数,计算数组空缺 总数,如果空缺总数大于0的个数,不是顺子,否则是顺子。注意如果5张牌发现有 对子,肯定不是顺子class Solution {publ...原创 2018-11-25 14:44:36 · 1079 阅读 · 0 评论 -
剑指offer 面试题64:求1+2+3+...+n c++
题目:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解析:多种方法(1)利用构造函数求解 (2)利用虚函数求解 (3)利用函数指针求解 (4)利用模板类型求解这里可以通过递归的方式进行计算,但是很疑问的地方在于如何结束递归。这里可以有多种的方式,基本方向是采用逻辑与或的方式来计算,与的时...原创 2018-11-27 13:23:23 · 765 阅读 · 0 评论 -
剑指offer 面试题65:不用加减乘除做加法 c++
题目:写一个函数求 两个整数之和, 要求在函数体内 不得使用“+”,“-”,“*”,“/”四则远算符号。思路:首先想到用位运算代替。分为3步,第一步让两个数字加起来不进位,可以使用异或运算,相同为0 相异 为1,第二步计算两个数字加起来的进位,可以用与操作然后左移 一位,因为进位只能由两个1加起来产生,所以使用与,然后左移。第三步 重复前面两步 直到不产生进位为止。class Solut...原创 2018-11-26 19:54:11 · 297 阅读 · 0 评论