
剑指offer
呆呆姑娘
这个作者很懒,什么都没留下…
展开
-
旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:非减排序说明原本的数组是有序的,经过旋转之后,以旋转位置为界可以分为两部分,各部分是有序的,找到这个界...原创 2019-01-17 11:29:53 · 93 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:1、链表1为空,则返回链表22、链表2为空,则返回链表13、两个链表不为空,判断两个链表的表头哪个小,小的作为合并链表的表头,依次比较后面的值/*struct ListNode { int val; struct ListNode *next; ListNod...原创 2019-04-02 14:13:50 · 109 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路:反转链表的表头即为原始链表的尾结点。考虑:1、输入的链表头指针是NULL,返回该表头指针 2、输入的链表只有一个节点,返回表头指针 3、输入的链表有多个节点,将节点的next指针指向前一个节点,进行反转链表,尾结点即为反转链表的表头/*struct ListNode { ...原创 2019-04-02 10:11:44 · 94 阅读 · 0 评论 -
链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:设置一个快指针(一次走两步)和一个慢指针(一次走一步),如果这两个指针相遇,则说明链表中包含环,否则不包含环。一个指针从头结点一次一步走,另一个指针从相遇点一次走一步,当两个指针再次相遇时,就是入口结点。/*struct ListNode { int val; struct L...原创 2019-04-02 09:45:20 · 111 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};用两个指针指向链表头部,第一个指针先走k-1步,到第k步,第二个指针从头和第一个指针同时走,第一个指针走到链表尾部时,...原创 2019-03-29 14:18:39 · 83 阅读 · 0 评论 -
二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路1:不移动数字n。把n和1做与运算,判断n的最后一位是不是1。然后把1左移一位得到2,再和n做与运算,判断n的右边第二位是不是1,通过不断的左移1,就可以判断n的每一位是不是1。class Solution {public: int NumberOf1(int n) { in...原创 2019-03-14 20:53:58 · 139 阅读 · 0 评论 -
二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:中序遍历:先遍历左子树再根结点然后是右子树分为以下几种情况:1、二叉树为空,返回空指针2、结点存在右子树,则下一个结点为右子树的最左子结点。3、结点不存在右子树,存在父结点,若该结点是父结点的左子结点,则下一个结点就是父结点。...原创 2019-02-27 11:18:15 · 109 阅读 · 0 评论 -
数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路1:用一个新数组记录每个数字出现的个数。因为所有数字都在0到n-1范围内,新数组大小可以设为n,相应的下标对应原数...原创 2019-02-26 15:43:03 · 104 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:栈的思想:“先进后出”,队列的思想:“先进先出”用一个栈实现入队列,另一个栈实现出队列。(1)入队列就相当于入栈(2)出队列需要先将栈1中的元素出栈,入栈到栈2中,把元素的顺序调换,先入栈1的元素就到栈2的顶部了。再对栈2执行出栈操作。stack.top(); 返回栈顶元素,不...原创 2019-01-16 17:51:21 · 196 阅读 · 3 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:前序遍历是先输出根节点,然后再左子树、右子数。中序遍历是先输出左子树,然后根节点,再右子树。(1)前序遍历的一个数为根节点,确定二叉树的根...原创 2019-01-16 17:21:09 · 114 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路1:利用栈“先进后出”的思想,将链表倒叙返回。从头到尾将链表遍历并入栈,然后,出栈放到数组中。/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* ...原创 2019-01-15 21:59:13 · 390 阅读 · 0 评论 -
替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:将空格替换为“%20”意味着多了两个字符,需要将字符串整体后移两位。首先,从头到尾遍历找到一共有多少个空格,然后,从尾部向前移动字符串。需要移的位数=空格数*2,再将字符“%”、“2”、“0” 分别插入。class...原创 2019-01-15 20:42:38 · 97 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路1:从右上角开始比较,如果大于目标值,向左移继续比较,如果小于目标值,向下移继续比较。class Solution {public: bool Find(int targe...原创 2019-01-15 17:09:37 · 84 阅读 · 0 评论 -
矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:找规律发现是斐波那契数列。class Solution {public: int rectCover(int number) { if(number<=2){ return numbe...原创 2019-01-21 10:31:55 · 116 阅读 · 0 评论 -
变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:先找规律:一个台阶有一种跳法(1) 两个台阶有两种跳法:(1,1)、(2) 三个台阶有四种跳法:(1,1,1)、(1,2)、(2,1),(3) ...原创 2019-01-17 20:31:33 · 543 阅读 · 0 评论 -
跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路:先找规律:一个台阶有一种跳法(1) 两个台阶有两种跳法:(1,1)、(2) 三个台阶有三种跳法:(1,1,1)、(1,2)、(2,1) ...原创 2019-01-17 20:16:17 · 120 阅读 · 0 评论 -
斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39思路:斐波那契数f(x)定义为: ;class Solution {public: int Fibonacci(int n) { if(n<=1) ...原创 2019-01-17 15:30:33 · 138 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:遍历树A,在树A中找与树B根节点相等的节点,找到继续比较左子树和右子树,如果完全相同,返回true。否则,继续遍历树A。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *ri...原创 2019-04-02 14:40:30 · 91 阅读 · 0 评论