随笔分类 -  剑指offer

1
字符串的排列
摘要:题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 分析: 虽然题目举例的输入时a 阅读全文
posted @ 2017-05-14 19:06 Bill_LHR 阅读(276) 评论(0) 推荐(0)
调整数组奇偶顺序
摘要:题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,是所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。 分析: 我们要做的是调整数组中元素的顺序,所以显然函数中主要的操作是交换元素,也就是交换奇数和偶数,使奇数位于偶数前边。在前边各种数组的题目中,我们常用到使用两个指针的方 阅读全文
posted @ 2017-05-07 15:59 Bill_LHR 阅读(1077) 评论(0) 推荐(0)
栈的压入、弹出序列
摘要:题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度 阅读全文
posted @ 2017-05-05 17:58 Bill_LHR 阅读(209) 评论(0) 推荐(0)
包含min函数的栈
摘要:题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。 分析: 首先想到的是在栈里添加一个成员变量用来保存最小的元素,每次压入一个新元素进栈时与该变量比较,如果更小则更新最小元素。那么问题来了,如果当前栈中最 阅读全文
posted @ 2017-05-04 21:12 Bill_LHR 阅读(175) 评论(0) 推荐(0)
顺时针打印矩阵
摘要:题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 分析: 这个题的重点是坐标 阅读全文
posted @ 2017-05-04 20:18 Bill_LHR 阅读(540) 评论(0) 推荐(0)
二叉树的镜像
摘要:题目描述: 操作给定的二叉树,将其变换为源二叉树的镜像。 分析: 这个题目相对简单,既然是镜像,只要把左右交换就好了。在遍历二叉树的过程中,每遍历一个根结点,交换其左右子结点即可。显然涉及二叉树的遍历应该使用递归,接下来应该考虑的是递归的终止条件,以及程序的鲁棒性:直到遍历的结点左右子结点都为空即止 阅读全文
posted @ 2017-05-04 16:34 Bill_LHR 阅读(467) 评论(0) 推荐(0)
树的子结构
摘要:题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 分析: 基本思想是分两步: 遍历树A,先找到A中与B的根值相等的结点R; 然后再判断树A中以R为根结点的子树是不是包含和树B一样的结构。 显然这两部过程中都需要遍历二叉树,而二叉树的遍历一般用递归完成。 阅读全文
posted @ 2017-05-04 14:59 Bill_LHR 阅读(262) 评论(0) 推荐(0)
合并两个排序的链表
摘要:题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 分析: 因为要合并的两个序列是递增有序的,而合并后的序列也要求是单调不减的,所以两个链表的头结点中比较小的那一个就是新的链表的头。这样就确定了新链表的第一个结点,拿出这个结点作为合并链表的头结点 阅读全文
posted @ 2017-05-04 10:43 Bill_LHR 阅读(272) 评论(0) 推荐(0)
数值的整数次方
摘要:题目描述: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 分析: 首先这个题的思路很简单,求base的整数次方,那么只要用exponent个base相乘就好了。基本的思路有了,接下来就要举测试用例来考虑有没有特殊情况了:当指数为零和负 阅读全文
posted @ 2017-04-26 17:36 Bill_LHR 阅读(226) 评论(0) 推荐(0)
位运算:二进制中1的个数
摘要:题目描述: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 分析: 作为渣渣,这个题我一开始真没想到用位运算。。 首先,说到二进制,就应该想到二进制的各种运算:按位与运算(&)、按位或运算(|)、按位异或运算(^)、按位取反(~)。再看题目,要求二进制表示中1的个数,既然要求1的个 阅读全文
posted @ 2017-04-26 17:01 Bill_LHR 阅读(731) 评论(0) 推荐(0)
斐波那契数列及其变形
摘要:题目描述: 写一个函数,输入n,求斐波那契数列的第n项。 分析: 斐波那契数列在递归的学习时经常被拿来做例子,当剑指offer上看到这个题的时候,我就直接用递归写了,然后发现了问题,调用栈空间太多。这就是递归方法的一个缺陷,虽然简单容易理解,然而效率上却为难了计算机。所以还是以循环来实现: long 阅读全文
posted @ 2017-04-26 16:45 Bill_LHR 阅读(1035) 评论(0) 推荐(0)
重建二叉树
摘要:题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}。二叉树结点的定义如下: struct BinaryTreeNode{ i 阅读全文
posted @ 2017-04-26 16:44 Bill_LHR 阅读(291) 评论(0) 推荐(0)
赋值运算符函数
摘要:题目描述: 如下为类型CMyString的声明,请为该类型添加赋值运算符函数 class CMyString{ public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void); priv 阅读全文
posted @ 2017-04-24 17:03 Bill_LHR 阅读(384) 评论(0) 推荐(0)
二维数组中的查找
摘要:题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从>上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整>数,判断数组中是否含有该整数。 分析: 显而易见,最简单的、最容易先想到的方法就是遍历数组了,然而O(n^2)的时间复杂度不是题目想要的,也不是我们 阅读全文
posted @ 2017-04-24 13:36 Bill_LHR 阅读(281) 评论(0) 推荐(0)
字符串中的空格替换
摘要:题目描述: 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 分析: 首先,还是想到简单、原始的方法,从头到尾扫描字符串,遇到每遇到一次空 格,先将空格之后的所有元素移动两个字节,然后将空格替换 阅读全文
posted @ 2017-04-24 13:34 Bill_LHR 阅读(356) 评论(0) 推荐(0)
从尾到头打印链表
摘要:题目描述: 输入一个链表的头结点,从尾到头打印链表每个节点的值。 /** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val(x), next(NULL) { * } * }; */ 分析 阅读全文
posted @ 2017-04-24 13:32 Bill_LHR 阅读(178) 评论(0) 推荐(0)
两个栈实现一个队列
摘要:问题描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 解法分析: 首先题目要求用两个栈实现一个队列,那么就要先分析为什么这么做。队列的特点就像排队的“先到先得”一样,即先入队的就先出队;而栈则正好相反,特点是“后进先出”,那么问题来了怎么用“后进先出”的得 阅读全文
posted @ 2017-04-24 13:27 Bill_LHR 阅读(234) 评论(0) 推荐(0)
在O(1)时间删除链表结点
摘要:问题描述: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点的定义如下: struct ListNode{ int m_nValue; ListNode* m_pNext; }; 分析: 老规矩,先考虑最简单粗暴的方法,既然是要删除结点,那么按照之前在数据结构中总结 阅读全文
posted @ 2017-04-24 13:13 Bill_LHR 阅读(201) 评论(0) 推荐(0)
链表中的倒数第k个结点
摘要:问题描述: 输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第一个结点。例如一个链表有6个结点,从头结点开始它们依次是1、2、3、4、5、6。这个链表的倒数第三个结点是值为4的结点。结点定义如下: struct ListNode{ int m_ 阅读全文
posted @ 2017-04-24 13:13 Bill_LHR 阅读(238) 评论(0) 推荐(0)
反转链表
摘要:问题描述: 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表结点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext; } 分析: 这个问题看起来与之前做的从尾到头打印链表看起来很相似,都是链表的“逆序”。但不同的是,这 阅读全文
posted @ 2017-04-24 13:12 Bill_LHR 阅读(188) 评论(0) 推荐(0)

1