
nowcoder-剑指offer
fullstack_lth
这个作者很懒,什么都没留下…
展开
-
剑指offer-字符串空格替换为“ ”
一、问题描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。二、思路由于规定是char*类型,所以没法用string类型字符串处理,我们从后往前依次替换,注意替换过程中需要考虑输出长度不超过length。三、代码//length为牛客系统规定字符串输出的最大长度,固定为一个原创 2016-08-27 10:23:17 · 817 阅读 · 0 评论 -
剑指offer-两个栈实现一个队列
一、问题描述时间限制:1秒空间限制:32768K用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。二、 思路深入理解栈的先入先出特性。在弹出操作时,如果栈2不为空,将栈1的数据全部入栈到栈2,然后才从栈2弹出。三、代码class Solution{public: void push(int node) {原创 2016-10-28 15:20:20 · 207 阅读 · 0 评论 -
剑指offer- 旋转数组的最小元素
一、问题描述时间限制:1秒空间限制:32768K把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。二、 思路采用三个指针,其中一个前一个后,一个在中间原创 2016-10-28 16:23:24 · 553 阅读 · 0 评论 -
剑指offer-矩形覆盖
一、问题描述时间限制:1秒空间限制:32768K我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?二、思路斐波那契数列。三、代码class Solution {public: int rectCover(int number) { if(number <= 0) return原创 2016-10-28 16:41:47 · 243 阅读 · 0 评论 -
剑指offer-二叉树的镜像
一、问题描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9原创 2016-10-29 23:22:16 · 297 阅读 · 0 评论 -
剑指offer-蛇形打印链表
一、问题描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.二、思路第一个循环即为结果数组中的数字个数要小于等于矩阵中的数字;进入循环后有四个小循环,分别是从左到右,从上到原创 2016-10-29 23:59:36 · 329 阅读 · 0 评论 -
剑指offer:树的子结构
一、问题描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)二、代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*原创 2016-10-19 23:53:33 · 207 阅读 · 0 评论 -
剑指offer-二维数组中的查找
一、问题描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。二、代码class Solution {public: bool Find(vector > array,int target) { bool res = false;原创 2016-10-20 00:20:09 · 214 阅读 · 0 评论 -
剑指offer-栈的压入弹出序列
一、问题描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)二、 思路1、首先判断弹出序列数组是否为空,如果为空,返回false;原创 2016-10-31 01:03:15 · 252 阅读 · 0 评论 -
剑指offer-二叉搜索树的后序遍历序列
一、问题描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。二、思路二叉树题目用递归做是没有悬念的,本题亦是如此。首先递归函数的退出条件是start>=end,返回真;其次第一个循环找到左右子树的分界点i - 1,i - 1前是左子树,i- 1后是右子树;第二个循环中如果左子树的值比根节点大,原创 2016-11-01 01:17:27 · 246 阅读 · 0 评论 -
剑指offer-二叉树中和为某一路径的和
一、问题描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二、思路采用递归思想,如果某一路径和为目标值且当前节点是叶子节点,那么将当前路径存入所求的数组中,如果不是,递归遍历左子树和右子树,但是一定要记得如果没有符合结果的路径,一定要将当前的节点弹出。三、代码class Solut原创 2016-11-25 21:31:21 · 303 阅读 · 0 评论 -
剑指offer-复杂链表的复制
一、问题描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)二、思路1、 复制每个节点的next;2、复制每个节点的random;3、拆分成两个链表。三、代码/*struct RandomListNo原创 2016-11-26 00:49:39 · 277 阅读 · 0 评论 -
剑指offer-从1到n整数中1的个数
一、问题描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。二、思路先将数字转换成字符串,然后将首字母和其后的数字分开进行处理,对首个数字后的数字采用原创 2016-12-08 20:55:59 · 603 阅读 · 0 评论 -
剑指offer-从上往下打印二叉树
一、问题描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。二、思路需要辅助队列,首先将根节点加入队列,接着进入循环,循环条件是队列不为空,将当前最前面的节点存入队列,然后弹出尾节点,如果根节点为空,则进行下次循环;否则依次将根节点左右子树节点加入队列。三、代码/*struct TreeNode { int val; struct TreeNode *left;原创 2016-11-05 09:35:07 · 245 阅读 · 0 评论 -
剑指offer-链表倒数第k个节点
一、问题描述输入一个链表,输出该链表中倒数第k个结点。二、思路最主要在到k-1位置前需要考虑指针域为空的情况。三、代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public原创 2016-10-22 11:00:29 · 243 阅读 · 0 评论 -
剑指offer-二叉树深度
一、问题描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。二、思路见二叉树最大深度三、代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(原创 2016-10-22 10:57:12 · 268 阅读 · 0 评论 -
剑指offer-青蛙跳台阶
一、问题一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。二、思路本题即为斐波那契数列,递归式如下: | 1, (n=1)f(n) = | 2, (n=2) | f(n-1)+f(n-2) ,(n>2,n为整数)三、代码cl原创 2016-08-27 10:36:15 · 400 阅读 · 0 评论 -
剑指offer-菲波那切数列
一、问题描述实现斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n二、思路循环实现即可。三、代码class Solution {public: int Fibonacci(int n) { if(n < 0) return -1; vector vec; vec.push_back(1原创 2016-08-27 10:45:58 · 459 阅读 · 0 评论 -
剑指offer-青蛙变态跳台阶
一、问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。二、思路分析:用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙一次性跳上n阶台阶的跳法数1(n阶跳),设定Fib(0) = 1; 当n = 1 时, 只有一种跳法,即1阶跳:Fib(1) = 1; 当n = 2 时, 有两种跳的方原创 2016-08-27 11:22:04 · 1004 阅读 · 0 评论 -
剑指offer-逆序打印链表
一、问题描述二、思路采用头插法先逆置链表,然后依次遍历链表节点。注意考虑链表的边界条件。三、代码/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {*原创 2016-08-27 13:53:55 · 558 阅读 · 0 评论 -
剑指offer-1的个数
一、问题描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。二、思路本题中最关键的是: n = n & (n - 1);这一操作相当于是将2进制的数的最后一位1由1变为0,有多少位1,就会变多少次。三、代码class Solution {public: int NumberOf1(int n) {原创 2016-08-27 14:09:04 · 419 阅读 · 0 评论 -
剑指offer-反转链表
一、问题描述输入一个链表,反转链表后,输出链表的所有元素。二、思路思路和逆序打印链表:逆序打印链表完全一致。三、代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public:原创 2016-08-27 14:16:58 · 441 阅读 · 0 评论 -
剑指offer-最大连续子数组和
一、问题描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?原创 2016-08-27 14:28:40 · 549 阅读 · 0 评论 -
剑指offer-指数幂
一、问题描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。二、思路注意考虑边界情况,如指数幂的正负号以及底数为0的情况。三、代码class Solution {public: double Power(double base, int exponent) { double result =原创 2016-08-27 13:22:37 · 524 阅读 · 0 评论 -
剑指offer-字符串全排列(有重复值)
一、问题描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。二、思路与 Permutations II思路完全一致。三、代码cl原创 2016-08-27 20:45:21 · 2221 阅读 · 0 评论 -
剑指offer-数组中出现超过一半的数字
一、问题描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。二、思路快排算法中的patition算法,返回中间的数即可。但要注意有可能数组中没有出现,此时我们需要对数组中间的数字验证: int num =原创 2016-08-27 23:03:48 · 413 阅读 · 0 评论 -
剑指offer-调整数组顺序使奇数位于偶数前面
一、问题描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。二、思路思路很简单,如果数组中只有一个个或者0个数,那么直接返回,不需要排序;否则,两个指针,一前一后,进入大循环i 三、代码class Solution {public: void r原创 2016-10-22 10:32:08 · 203 阅读 · 0 评论 -
剑指offer-丑数
一、问题描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。二、思路见丑数三、代码class Solution {public: int GetUglyNumber_Solution(int index) { if(index原创 2016-10-22 10:54:18 · 203 阅读 · 0 评论 -
剑指offer-包含min函数的栈
一、问题描述二、思路两个栈,一个当前栈data,一个辅助栈m_min,辅助栈用来存储当前的最小值,如果出栈,辅助栈也出栈,栈顶元素始终是当前的最小值。在入栈时,如果辅助栈为空或者当前值小于辅助栈栈顶元素,则将当前值加入辅助栈;否则将辅助栈的栈顶元素加入辅助栈,表明此次有相同数字入栈。以此保证在其中一个最小值出栈时,辅助栈也出栈时,辅助栈还能有一个最小值。三、代码class So原创 2016-10-30 23:57:31 · 223 阅读 · 0 评论