剑指offer
小强19920310
这个作者很懒,什么都没留下…
展开
-
二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:中序遍历整棵树。那么比较小的结点先访问。如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了/*struct TreeNode { in...原创 2018-05-10 00:23:45 · 124 阅读 · 0 评论 -
二叉搜索树的第k个结点
二叉搜索树的第k个结点原创 2018-04-26 23:11:51 · 116 阅读 · 0 评论 -
二叉树的下一个结点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:中序遍历顺序为:左->根->右判断是否有右子树,如果有那么下一个节点为其右子树的最左节点,如果没有右子树节点,那么该节点移动到其父节点(此处有指针直接指向父节点)。当该节点不是其父节点的右子树的时候,那么该节点就是所求。...原创 2018-04-26 23:27:30 · 104 阅读 · 0 评论 -
平衡二叉树
输入一棵二叉树,判断该二叉树是否是平衡二叉树。平衡二叉树为:每一个节点的左右子树高度差都小于等于1.空树为平衡树 先序遍历每一个节点,并计算其左右子树的高度差class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { //平衡二叉树的左右子树高度差小于1,所以首先求二叉树的高度 ...原创 2018-04-26 23:53:26 · 134 阅读 · 0 评论 -
构建乘积数组
题目描述 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…A[i-1]*A[i+1]…*A[n-1]。不能使用除法。方法一:时间复杂度为O(n2)class Solution {public: vector<int> multiply(const vector<int>&...原创 2018-05-05 22:10:13 · 124 阅读 · 0 评论 -
和为S的两个数字
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。class Solution {public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { //思路:首先查找数组中所有和为s的组合,然后计算...原创 2018-05-05 22:11:30 · 121 阅读 · 0 评论 -
和为S的连续正数序列
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!class Solution {public:...原创 2018-05-05 22:17:24 · 133 阅读 · 0 评论 -
删除链表中重复的结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : ...原创 2018-05-05 22:18:54 · 109 阅读 · 0 评论 -
左旋字符串
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!分析:对于字符串左旋,实质为字符串旋转。对形如XY的字符串经过旋转后变为YX.此问题中,字符串左旋:n为旋...原创 2018-05-12 18:58:37 · 189 阅读 · 0 评论 -
表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。class Solution {public: void ScanString(char * &amp;number)//此处传入的...原创 2018-05-12 22:51:43 · 151 阅读 · 0 评论 -
把字符串转换成整数
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0class Solution {public: int StrToInt(string str) { int flag = 1; //设置符号标志 long long ret = 0; //考虑到返回值可能较大,定义为long lon...原创 2018-05-12 23:12:54 · 170 阅读 · 0 评论 -
对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:对称的二叉树中左子树的左孩子等于右子树的右孩子,左子树的右孩子等于右子树的左孩子 而且当左右子树中有一个为空时就不会是对称/*struct TreeNode { int val; struct TreeNode *left; struct Tree...原创 2018-05-21 23:30:49 · 142 阅读 · 0 评论 -
链表——剑指offer
从尾到头打印链表 思路:先把链表翻转,然后将翻转后的链表打印出来 这种方法:因为多分配链表节点指针,故可能会对内存的消耗要大一点 时间复杂度为O(n)vector<int> printListFromTailToHead(listnode *head){vector<int>a;listnode *p=NULL;listnode *p1=NULL;...原创 2018-05-23 20:23:28 · 216 阅读 · 0 评论 -
翻转单词顺序列
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:先反转整个字符串,然后根据...原创 2018-05-29 22:09:04 · 170 阅读 · 0 评论 -
按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:采用树的广度优先搜索策略 借助两个栈:一个用来实现从左到右输出,一个用来实现从右到左输出,利用栈的先入后出顺序,不同的层时左右子树入栈的顺序不同,应该与其应出栈顺序相反/*struct TreeNode { int val;...原创 2018-05-29 23:05:33 · 157 阅读 · 0 评论 -
空格替换
空格替换为 %20(1) 遍历字符串统计空格的个数n,以及字符串的长度len。 (2) 每增加一个空格字符串长度增加2,则替换后字符串长度为len1=len+2*n。 (3) 设置两个指针,一个指向原来字符串末尾len处,一个指向替换后总长度的末尾len1处。 (4) p1向前移动依次把经历的字符串放置p2所指位置,p2赋值后前移一位,直到p1遇到空格,此时p2处插入%20并前移三个。然...原创 2018-06-05 23:05:44 · 180 阅读 · 0 评论 -
数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:一个数组中只出现一次,考虑位运算符:抑或;抑或的结果为,相同位为0,不同位为1.所以如果两个数相等时那么抑或结果为0,且0与任何一个数抑或的结果都为原数。故当数组中只有一个数出现一次时,可以从头到尾抑或数组的每一个元素,最后的结果一定是唯一的数。当数组中有两个数只出现一次时,按照上述办法抑或的结果为这...原创 2018-04-09 23:07:08 · 338 阅读 · 0 评论 -
整数中1出现的次数
思路:对于整数中出现1的次数,可以考虑利用取余和除法运算来求得。采用暴力循环。对每一个数的每一位利除10取余来取得对于任何数字出现的次数都可以利用这种方法求得,只不过余数要等于对应的数字X;class Solution {public: int NumberOf1Between1AndN_Solution(int n) { int temp; int co...原创 2018-04-10 23:20:39 · 150 阅读 · 0 评论 -
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
class Solution { private: string temp; private: vector<string> result; public: vector<string> Permutation(string str) { vector<string> result; //创建字符串数组 ...原创 2018-02-28 19:12:23 · 595 阅读 · 0 评论 -
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
二叉搜索树的左子树节点小于根节点小于右子节点二叉搜索树的后序遍历序列中根节点一定在数组的最后一个位置可以把序列分为两部分,分别代表根节点左子树和右子树,然后对新形成的序列继续递归判断可得到结果class Solution {public: bool VerifySquenceOfBST(vector<int> sequence) { int len=sequ...原创 2018-04-03 23:15:29 · 1749 阅读 · 0 评论 -
把数组排成最小数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路分析:对数组进行全排列,然后排序,此方法时间复杂度较高把数组转为字符串数组,定义字符串数组的一种排序规则,不是把小的数排在前边,而是两个字符串链接起来,nm,mn当nm<mn则n排在前边,否则n排在后边class ...原创 2018-04-16 23:22:44 · 142 阅读 · 0 评论 -
树的子结构
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: bool HasSubtree(TreeNode* p...原创 2018-04-02 23:45:49 · 93 阅读 · 0 评论 -
重建二叉树
问题描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路分析:利用循环和递归(1)在前序遍历序列中第一个元素一定为整个树的根节点(2)中序遍历中与此元素相等的元素之前的元素属于整个树的左子树,之后元素属于右...原创 2018-03-28 23:16:46 · 91 阅读 · 0 评论 -
二叉树中和为某一值的路径
思路:建立一个二维数组,其中每一行代表一条路径;用一个一维数组统计每次的路径,统计结束后放到二维数组中;当满足结点值和相等并且节点为叶节点时满足条件,把此条路径加入;利用递归实现/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), l...原创 2018-04-01 16:47:56 · 100 阅读 · 0 评论 -
链表环
第一步,找环中相汇点。分别用p1,p2指向链表头部,p1每次走一步,p2每次走二步,直到p1==p2找到在环中的相汇点。第二步,找环的入口。接上步,当p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,设环中有n个节点,p2比p1多走一圈有2x=n+x;n=x;可以看出p1实际走了一个环的步数,再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2;此时p1指向环的入口...原创 2018-03-26 23:05:30 · 127 阅读 · 0 评论 -
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在
class Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers) { int x; int y=numbers.size();//当数组为空时返回0 if(y==0)return 0;//当数组只有一个元素时返回其 if...原创 2018-03-24 22:18:47 · 184 阅读 · 0 评论 -
从上往下打印出二叉树的每个节点,同层节点从左至右打印
思路:首先从头结点开始,因为一层一层的读取,每读一个节点时,要记录其左右子节点,下一个读取的为其左子节点,然后再次读取其右子节点,所以要存入一个队列依次,然后每次从队列头去节点读取值 int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NU...原创 2018-03-23 22:49:59 · 606 阅读 · 0 评论 -
已知一个栈的入栈序列,判断给定的一个序列是否为其出栈序列
思路:(1)栈为后入先出序列(2)将入栈序列的元素一个一个入栈然后和出序列中每个元素比较。取序列第一个元素时,把第一个序列的各个元素依次入栈,然后入栈一个后和序列元素比较,如果相同那么将这个元素出栈,并且与序列的第二个元素再进行比较bool IspopOrder(vector<int> pushv,vector<int> popv){bool isPop=false...原创 2018-03-23 21:48:24 · 2430 阅读 · 0 评论 -
给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。
class Solution {public: /* * @param nums: a list of integers * @return: The majority number that occurs more than 1/3 */ int majorityNumber(vector<int> &nums) { ...原创 2018-03-16 23:00:25 · 1423 阅读 · 0 评论 -
第一次出现的字符位置
思路:(1)建立一个数组包含128个元素,因为字符在ASCLL表中对应的整数值最大为128,而这里只有字母表示而成,故128足够用(2)首先初始化数组元素全为0(3)然后遍历整个字符串,把每个字符对应的ascll整数值对应的元素出现一次就加1 (4)然后最后从字母顺序表示的顺序遍历这个数组,第一个字母出现次数为1 的为所求class Solution {public: int First...原创 2018-03-14 23:31:39 · 1808 阅读 · 0 评论 -
用两个栈实现一个队列,完成push和pop函数
思路:(1)栈为后入先出,队列为先入先出;(2)进入队列的操作用栈1来完成,然后用栈2来完成出栈操作,把栈1的数据弹出后放入栈2,那么栈1中最后入栈的现在进入栈2的栈底最后出栈,正好实现队列的后入后出,最开始入栈1的数在栈2 的栈顶,最先出队列,相当于在队列的尾部class Solution{public: void push(int node) { stack1.pu...原创 2018-03-14 22:32:16 · 2021 阅读 · 0 评论 -
输入一个链表,输出该链表中倒数第k个结点。
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { int count=0; ListNode *temp = pListHead; //注意,不能返回临时变量,因为临时变量的生存期只在此函数内 while (pListHead != NULL) ...原创 2018-03-09 21:11:15 · 227 阅读 · 0 评论 -
斐波那契数列和应用举例我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
首先介绍一下斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2...原创 2018-03-02 13:12:10 · 1217 阅读 · 0 评论 -
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
(1)链表为空的情况if(!pHead){return;}(2)链表只有一个节点的情况以及在遍历链表的过程中考虑当前只有一个结点的情况从头遍历链表,对每一个节点复制一个,插在它后边;接着遍历这个链表,那么原链表中节点的特殊指针若为空,则复制链表对应节点的特殊指针也为空,若源链表中结点的特殊指针不为空,那复制链表中对应节点的特殊指针为原链表中结点特殊指针的->next。class Sol...原创 2018-03-01 12:53:59 · 630 阅读 · 0 评论 -
二维数组查找
在一个二维数组中每一行从左到右按照递增排序。每一列从上到下按照递增顺序排列。给定一个数字,在数组中查找这个数字,如果能找到则返回true,如果找不到则返回false1. bool Find(int target,vector<vector<int>> array) 2. { 3. int row=array.size();//计算行数 4. ...原创 2018-06-05 23:06:53 · 230 阅读 · 0 评论