剑指offer
文章平均质量分 59
JoliceYU
技术小白 一步一个脚印 不断努力不断学习
展开
-
数据流中的中位数
1、题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。2、代码2.1 原理:用两个堆实现,左边是做大堆,右边是最小堆,当数据总数是偶数的时候,中位数是两个堆首元素和的一半;当数据是奇数的时候,可以约定取最大堆或者是最小堆的首元素。 2.2 思...原创 2018-03-20 18:28:19 · 1927 阅读 · 1 评论 -
正则表达式匹配
1、题目描述请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配。2、代码2.1原理 这种匹配问题,开始看起来很复杂,无心下手,但是入手将所有的...原创 2018-03-11 16:37:59 · 368 阅读 · 0 评论 -
数组中重复的数字
1、题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。2、代码12.1 原理:特别注意这个题目中的条件设置,数字的长度为N,数组里所有数组的范围是0-(N-1)...原创 2018-03-11 14:08:49 · 585 阅读 · 0 评论 -
把字符串转换成整数
1、题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。2、代码2.1 原理: 这个题目从题目本身上来说是不难的,但是主要是需要注意一些特殊的情况需要加以判断,以下是一个需要考虑的特殊情况: (1)如果输入的字符串是空的字符 (2)如果输入是带正负号的字符串 (3)在(2)的基础上,如果只有一个字符,且...原创 2018-03-11 12:07:46 · 1787 阅读 · 0 评论 -
求1+2+3+...+n
1、题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。2、思路12.1 思路:因为不能用乘除法、for、while、if、else、switch、case等,就是相当与没法累计计算和了以及计算求和的终止条件。思路1是利用函数递归调用计算求个次数,利用逗号条件判断表达式计算终止条件。 2.2...原创 2018-03-11 09:52:02 · 3716 阅读 · 0 评论 -
不用加减乘除做加法
1、题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。2、代码2.1 思路: 联系平时做十进制加法的思路,当两个数相加的时候,先将对应每个位相加,但是不产生进位,但是将进位的位置记录;第二部就是对应位相加但是不进位的结果和记录进位的数相加,最后就是结果。因此这个题目的思路在于: (1)sum0=nun1^num2;按位异或,这样就相当于两个数...原创 2018-03-11 09:08:18 · 257 阅读 · 0 评论 -
数组中出现次数超过一半的数字
1、题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2、代码1:2.1思路:如果一个数字在数组中出现的次数多于一半,那么这数字一定是整个数组数字的中位数。因为核心点在于如何求数组的中位数。求中位数,最快的就是快快速排序...原创 2018-03-03 13:21:46 · 294 阅读 · 0 评论 -
字符串的排列
1、题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。2、代码2.1题目思路: 基本的思路是:一个字符串的排列等于第一字符和后面剩余字符串排列的组合,对于含有N字符的字符串,组合中第一个字符串有N种可能,那么将所有的字符串轮流放在组合第一个当第一个...原创 2018-03-03 10:48:49 · 610 阅读 · 0 评论 -
二叉树的镜像
1、题目描述2、代码2.1思路:这个题目主要的思路分为两步。 (1)先序遍历这个树。这里只能是先序遍历,中序和后序遍历都不行 (2)在遍历访问根节点的时候,交换每个根节点的左右子树。 2.2代码:#include<iostream>using namespace std;struct TreeNode { int val; struct...原创 2018-02-24 13:05:40 · 185 阅读 · 0 评论 -
包含min的栈
1、题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。2、代码和思路2.1思路: 用栈这个容器实现,因为其具有后进先出的特点。为了实现min,可以构造一个辅助栈:放入第一元素的时候,存放元素的栈和辅助栈同时将元素压入栈,后面再压入元素,如果辅助栈的栈顶元素大于等于(这里必须是大于等于,要考虑所有压入元素相同的情况)要压入的元素,那么将当前元素也压入辅助...原创 2018-02-25 10:19:31 · 176 阅读 · 0 评论 -
栈的压入、弹出序列
1、题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2、代码和思路2.1思路:用一个辅助栈实现。 (1)将第一个序列第一个元素放...原创 2018-02-25 11:26:00 · 248 阅读 · 0 评论 -
序列化二叉树
1、题目描述请实现两个函数,分别用来序列化和反序列化二叉树2、代码12.1 原理:序列化的时候,先序遍历二叉树,将NULL的结点序列化为‘&’,每2个节点的序列化结果之间用逗号分离开。反序列化的时候:依次遍历字符串,构建二叉树即可。序列化和反序列化都是递归的过程。 2.2 代码://先序遍历二叉树void preNode(TreeNode *root, string&a...原创 2018-03-20 10:21:56 · 338 阅读 · 0 评论 -
数组中的逆序对
1,题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%10000000072、代码2.1思路:基于归并排序进行计算逆序对,本质上是分而治之的思想。关于归并排序可以参考博客http://blog.csdn.net/yuehailin/articl...原创 2018-03-06 11:08:37 · 272 阅读 · 0 评论 -
删除链表中重复的结点
1、题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->52、代码1:2.1 原理:首先判断第一个节点是不是值重复的结点,如果是,找到第一个不重复的结点作为头指针,重新调用函数即可;如果第一个节点不是值重复的结点,...原创 2018-03-13 11:16:32 · 332 阅读 · 0 评论 -
确定链表中是否有环
1、题目描述在一个链表中,判断是否存在环状结构,如果存在返回环状结构的入口结点,如果没有,返回NULL。2、代码12.1 原理: (1)通过双指针法(一个一倍速,一个二倍数,同时开始遍历)遍历链表,确定是否有环。 (2)如果有环,确定环内节点的个数N。 (3)两个指针p1和p2同时指向链表头指针,相同速度遍历链表,p2比p1先走N个节点,当两个指针相遇的时候,两个指针一定...原创 2018-03-12 21:53:40 · 362 阅读 · 0 评论 -
对称的二叉树 + 二叉树的下一个结点
1、对称二叉树1.1 题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 1.2 原理:需要注意的是,题目中同样的理解,必须是结构一样,且对应节点的值也要是一样的。遍历的思想,对于根节点的左右子树可以分别将其看成两个二叉树1和树2,同时遍历两个二叉树,只要对应的值相当,每次遍历中比较树1的左节点与树2的右节点,树1的右节点和树...原创 2018-03-18 16:12:47 · 325 阅读 · 0 评论 -
丑数
1、题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。2、代码12.1:思路:因为丑数的因子只能是2、3和5,因此一个丑数的2、3和5倍的数一定是丑数。所以只需要记录一个丑数的系列的最大值,就可以推出当下的下一个丑数。方法:假设现在从小到大的一个丑...原创 2018-03-05 14:10:34 · 354 阅读 · 0 评论 -
字符流中第一个不重复的字符
1、题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。如果当前字符流没有存在出现一次的字符,返回#字符。2、思路这个题目是需要统计每个字符出现的总次数和顺序,每次输出的时候,只输出所有的次数为1的字符中最先输入的那...原创 2018-03-11 20:51:31 · 358 阅读 · 0 评论 -
整数中1出现的次数(从1到n整数中1出现的次数)
1、题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。2、代码12.1、思路:任何数据范围分成两个部分。以3258为例,首先将1-3258的范围...原创 2018-03-04 14:47:48 · 258 阅读 · 0 评论 -
树的子结构
1、题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)2、代码2.1思路:这个题目主要是分为三步骤实现。 (1)第一步是实现树1的遍历,遍历树1的每个节点; (2)第二步骤,判断遍历树1的以树1的每个节点开始的树是否包含树2的子构,只需要判别对应节点和树2的根节点的值是否一样,一样以当树1的前节点的起始节点的树1分支中则可能包含...原创 2018-02-24 11:43:18 · 150 阅读 · 0 评论 -
孩子们的游戏(圆圈中最后剩下的数)----约瑟夫死亡问题
1、题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到...原创 2018-03-10 15:23:32 · 1583 阅读 · 1 评论 -
二叉搜索树与双向链表
1、题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。2、代码1:(自己实现)2.1思路:因为二叉搜索树的左右子也是一个二叉搜索树,因此对于整个二叉搜索树的根节点来说,只要将其左右子树分别转换成一个双向链表,那么再将根节点连上就可以了,那么这就是一个递归问题了。需要注意的一个点:对于根节点来说,其左边相连是应该是左...原创 2018-03-02 09:51:03 · 228 阅读 · 0 评论 -
旋转数组的最小值
一、题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。二、思路二分查找:这里最明显的就是二分查找,二分查找的原理不多说,但是需要注意的一点是,在写二分查原创 2018-01-07 21:34:33 · 225 阅读 · 0 评论 -
二进制中1的个数
1、题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。2、代码(1)正确代码:int NumberOf1(int n){ int data=1; int sum=0; while(data) { if(n&data) sum++; // data=1data;原创 2018-01-17 10:18:12 · 156 阅读 · 0 评论 -
斐波那契数列的实现
1、代码(1)递归版本:存在重复计算,代码简单,但是不可取int Fibonacci1(int n) { if((n==0)||(n==1)) return 1; return Fibonacci1(n-1)+Fibonacci1(n-2);}(2)循环循环版本:计算效率高。// 非递归循环的版本int Fibonacci2(int n原创 2018-01-15 21:15:05 · 366 阅读 · 0 评论 -
两个栈实现队列/两个队列实现栈
一、题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。二、代码1 自己代码 基本思路:一个栈用于压缩,一个专门用于弹出。因为栈是先进后出,所有的元素入栈再出栈,再入栈就可以将顺序调整过来。但是没有想到优化。class Solution{public: void push(int node) {原创 2018-01-07 20:40:28 · 320 阅读 · 0 评论 -
合并两个排序的链表
1、题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。2、代码和思路结构体定义struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {}};(1)递归版本原创 2018-01-23 19:12:19 · 180 阅读 · 0 评论 -
重建二叉树
一、题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回二、代码TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin){ if(原创 2018-01-04 18:31:57 · 288 阅读 · 0 评论 -
从尾到头打印链表
一、题目描述输入一个链表,从尾到头打印链表每个节点的值。二、代码1、解决该题目的代码1如下:struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), next(NULL) {} // 注意这种结构体的构造函数的形式};class Solution {publi原创 2018-01-03 20:53:13 · 281 阅读 · 0 评论 -
替换空格题目
1、题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。2、代码1、自己原始的答案:void replaceSpace(char *str,int length) { vector<char> vec_char; for(int i=0;i<leng原创 2017-12-21 09:00:41 · 336 阅读 · 0 评论 -
数值的整数次方
1、题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。2、代码思路比较简单,但是需要考虑几种特殊情况的出现。 (1)自己代码double Power1(double base, int exponent) { double sum=1; for(int i=0;i<abs(exponent);原创 2018-01-17 20:10:26 · 185 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
1、题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。2、代码(1)自己代码1// 自己实现1 void reOrderArray1(vectorint> &array) { vectorint> vecj, vecO; for原创 2018-01-18 11:15:20 · 171 阅读 · 0 评论 -
翻转单词顺序列VS左旋转字符串
一、翻转单词顺序列1、题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么...原创 2018-03-09 16:23:54 · 324 阅读 · 0 评论 -
和为S的连续正数序列
1、题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!2、代码12.1 原理:这里是求...原创 2018-03-09 15:14:19 · 277 阅读 · 0 评论 -
数组中只出现一次的数字
1、题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。2、代码源码2.1异或运算: 主要用到了位运算中中的异或运算。异或运算有很多很好的性质,关于异或运算的性质见博客http://blog.csdn.net/gtkknd/article/details/52798337 这里说下几个重要的性质:异或运算 (1)任何数据异...原创 2018-03-08 10:29:21 · 330 阅读 · 0 评论 -
数字在排序数组中出现的次数
1、题目描述统计一个数字在排序数组中出现的次数。2、代码2.1:因为数组是已经排序好的,因此可以直接使用二分查找,只需要找到第一个K和最后一个K出现的下标,就可以计算出K在数组中出现的次数。 2.2代码:#include<iostream>#include<vector>using namespace std;//获取第一个k的位置int...原创 2018-03-07 11:27:43 · 211 阅读 · 0 评论 -
两个链表的第一个公共结点
1、题目描述输入两个链表,找出它们的第一个公共结点。2、代码12.1、思路:如果两个链表有公共节点,那么其公共节点之后的结点就是一样的。那么两个链表头到公共节点的距离差就是两个链表的长度差,因此,只需要求出两个链表的长度只差M,让长的链表先走M个节点,再继续同时遍历两个链表,当两个链表的指针相等的时候,就是第一个相同的结点。 2.2、代码:#include<iostre...原创 2018-03-07 10:51:02 · 411 阅读 · 0 评论 -
二叉树中和为某一值的路径
1、题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。2、代码和思路2.1思路:本质上是一种带记忆的DFS(深度优先搜索)来遍历整个二叉树。主要是如何记忆路线。以下是自己理解的算法思路: (1)基于先序遍历遍历二叉树。每访问一个节点就把这个节点的值放到公共的vector中,这个vecto...原创 2018-02-26 16:19:31 · 158 阅读 · 0 评论 -
反转链表
1、题目描述输入一个链表,反转链表后,输出链表的所有元素。2、代码(1)代码1:先将所有的节点都存储到一个栈中,利用栈先进后出的特点,再全部弹出,构建新的链表。struct ListNode{ int val; struct ListNode *next; ListNode(int x) :val(x), next(NULL){}};// -- 用堆原创 2018-01-18 21:33:15 · 214 阅读 · 0 评论 -
链表中倒数第k个结点
1、题目描述输入一个链表,输出该链表中倒数第k个结点。2、代码:双指针法(1)代码1 直接用容器实现,或者是用堆栈实现也行,把每个节点node的指针都存储起来。ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead==NULL) return NULL;原创 2018-01-18 11:39:28 · 212 阅读 · 0 评论