剑指Offer算法实现
文章平均质量分 71
_高山流水_
这个作者很懒,什么都没留下…
展开
-
剑指Offer算法实现之一:赋值运算符函数
题目:如下为类型CMyString的声明,请为该类型添加运算符函数 class CMyString{ public: CMyString(char *pData = NULL); CMyString(const CMyString& str); ~CMyString(); private: char *m_pData; }; 思路:考虑下列问题:原创 2013-08-01 10:00:57 · 916 阅读 · 0 评论 -
剑指Offer算法实现之十五:链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个节点。例如一个链表有6个节点,从头开始他们的值依次是1、2、3、4、5、6。这个链表的倒数第三个节点是值为4的节点。链表的数据结构如下:struct ListNode { int m_nValue; ListNode *m_pNext; }; 思路: 双指针“追赶原创 2013-08-04 08:47:15 · 908 阅读 · 0 评论 -
剑指Offer算法实现之十九:二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。 二叉树节点定义如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; };思路: 遍历二叉树,交换每个节点的左右子树 编译环境:ArchLinux+Clang3.3, C++原创 2013-08-04 20:44:36 · 823 阅读 · 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 思路: ① 递归打印,每次打印一圈 ② 递归终止条件:设待打原创 2013-08-04 20:58:53 · 1759 阅读 · 0 评论 -
剑指Offer算法实现之二十一:包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push和pop的时间复杂度都是O(1)。 思路: min值是变化的,并且当前min弹出后新的min是是什么? 直接的想法:用一个min栈专门跟踪每个push操作后对应的最小值。因此min栈与数据栈占用空间相同 能否优化空间?仅当push元素x 编译环境:ArchLinux+Clang3.原创 2013-08-04 21:06:07 · 999 阅读 · 0 评论 -
剑指Offer算法实现之二十四:二叉搜索树的后续遍历序列
题目:输入一个整数数组,判断该数组是不是某个二叉搜索数的后续遍历的结果。如果是则返回true,否则返回false。假如输入的数组的任意两个数组都互不相同 思路: 后续遍历,最后一个元素为root。BST的特点是左子树所有节点小于等于root,右子树所有子节点均大于等于root。 递归,找到可能是左子树的序列,余下的为右子树的序列。判定候选的右子树序列是否满足大于等于root的条件。若满足,递原创 2013-08-04 21:22:46 · 755 阅读 · 0 评论 -
剑指Offer算法实现之十八:树的子结构
题目:输入两颗二叉树A和B,判断B是不是A的子结构。二叉树节点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; }; 思路: ① 二叉树的每个节点往下均是一个二叉树。使用两个函数,一个函数递归遍历二叉树节点,对于每一个节点,调用另一个判原创 2013-08-04 20:39:11 · 817 阅读 · 0 评论 -
剑指Offer算法实现之二十二:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1就是该栈对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。 思路: 使用辅助站,根据模拟弹出序列和压入序列 编译环境:ArchLinux+Clang3.3,C++11 实现一: #i原创 2013-08-04 21:11:40 · 903 阅读 · 0 评论 -
剑指Offer算法实现之二十三:从上往下打印二叉树
题目:从上往下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印。二叉树节点定义如下:struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; }; 思路: 基本的广度优先遍历算法BFS,使用队列。对于每个待遍历的元素,先入队。对于队列的每个元素原创 2013-08-04 21:16:19 · 909 阅读 · 0 评论 -
剑指Offer算法实现之十七:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照顺序递增排序的。链表的节点定义如下:struct ListNode{ int m_nValue; ListNode *m_pNext; }; 思路: ① 递归:对于链表PHead1、pHead2。取其小者作当前节点,剩余部分作两个链表递归构造新链表的剩余部分。 ② 迭代:同时遍历两个链表,取小者做当前节点原创 2013-08-04 20:26:46 · 726 阅读 · 0 评论 -
剑指Offer算法实现之十六:翻转链表
题目;定义一个函数,输入一个链表的头结点,翻转该链表并输出翻转后链表的头结点。链表结点定义如下:struct ListNode { int m_nKey; ListNode *m_pNext; }; 思路: 链表的基本操作。遍历链表的每个节点,同时维护指向新链表head的指针即可 编译环境:ArchLinux+Clang3.3, C++11 实现一: #include原创 2013-08-04 20:13:27 · 754 阅读 · 0 评论 -
剑指Offer算法实现之二十五:二叉树中和为某一值的路径
题目:输入二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从数的根节点开始往下一直到叶节点所经过的节点形成一条路径。二叉树的接待你定义如下:struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; }; 思路: 递归,函数参数中维护”路原创 2013-08-04 21:28:10 · 768 阅读 · 0 评论 -
剑指Offer算法实现之十四:调整数组顺序使奇数在偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 思路: 类似于快速排序的分区函数。可在线性时间内完成 编译环境:ArchLinux+Clang3.3,C++11 实现一:双指针两端扫描交换法 #include using namespace std; void reorder_oddeven(int *a,原创 2013-08-03 20:26:46 · 853 阅读 · 0 评论 -
剑指Offer算法实现之十三:在O(1)时间删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。链表节点与函数定义如下:struct ListNode{ int m_nValue; ListNode *m_pNext; }; void DeleteNode(ListNode **pListHead, ListNode *pToBeDeleted); 思路: ①单向链表,若按照常规思路,即使待删原创 2013-08-03 20:19:40 · 1023 阅读 · 0 评论 -
剑指Offer算法实现之二:实现Singleton模式
题目:实现Singleton模式 说明:以下考虑主要基于Java 思路: 单例模式一般是多线程环境下static字段的初始化问题。并且需要提供private构造器。 额外可能需要考虑的: 1. 即使仅提供private构造器,仍然可以通过反射机制创建多个实例。若需要,可以提供计数机制,防止这种情况发生。 2. 单例对象的序列化与反序列化问题(使用原创 2013-08-01 19:27:34 · 1208 阅读 · 0 评论 -
剑指Offer算法实现之五:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头返货来打印每个节点的值。 链表定义如下:struct ListNode{ int m_nKey; ListNode *m_pNext; };思路: 无论是否可以修改源链表的结构,从逻辑上将,是完整“遍历”在先,打印输出在后。先进后出,这是stack机制与函数调用机制,因此有两种实现办法 编译环境:ArchLinux+Clang3.3, C++11 实原创 2013-08-02 11:24:18 · 669 阅读 · 0 评论 -
剑指Offer算法实现之四:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are Happy”,则输出“We%20are%20Happy”。 思路:一个空格的替换需要两个额外的字符空间。这是一种需要扩展空间的“替换”。 ① 若不可修改源字符串,即“复制式”的替换,则可先申请足够的额外空间,再从前往后拷贝源字符串,拷贝过程中作替换。 ② 若可修改源字符串,并确保源字符串尾部后有足够的空间以供原创 2013-08-02 11:13:40 · 723 阅读 · 0 评论 -
剑指Offer算法实现之三:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否有该整数。 例如,下面的二维数组。如果在其中查找7则返回true,查找5则返回false: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 思路:原创 2013-08-02 08:45:37 · 781 阅读 · 0 评论 -
剑指Offer算法实现之六:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数组。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},重建出图所示的二叉树并输出 它的头结点。 二叉树节点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTre原创 2013-08-02 20:47:09 · 831 阅读 · 0 评论 -
剑指Offer算法实现之九:斐波那契数列
题目:写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下: 思路: ① 可用直接将上述公式翻译成递归函数版本。但算法复杂度是指数级的,且不能写成尾递归的形式 ② 可用循环迭代解决 编译环境:ArchLinux+Clang3.3,C++11 实现一:迭代版本。时间复杂度O(n) #include #include using namespace std; lon原创 2013-08-02 21:32:07 · 1184 阅读 · 0 评论 -
剑指Offer算法实现之八:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 思路: ① 题目并为说数组元素无重复 ② “有序”数组的查找,考虑使用二分查找。找到“中位”元素,不满足条件,则“二分”缩小收缩范围 ③二分查找的“变体”,注意特例 编译环原创 2013-08-02 21:17:10 · 1798 阅读 · 0 评论 -
剑指Offer算法实现之十:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示法中1的个数。例如把9表示成二进制1001,有2位是1。因此如果输入9,该函数输出2. 思路: ① 是否处理负数?是。若是负数,符号位算计数吗?计数 ② 最小负数与最大整数不对称性。若输入是INT_MIN,如何解决?绝大多数计算机均使用二进制补码表示负数 ③ 在C/C++中,有符号数的有移位结果是未定义的。可能是算数右移、也可能是逻辑右原创 2013-08-02 21:52:39 · 767 阅读 · 0 评论 -
剑指Offer算法实现之十二:打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3一直到最大的3位数字即999. 思路: ① 考虑大数字,采用数组模拟自增运算 ② 也可考虑使用基于数组的全排列,使用递归实现 编译环境:ArchLinux+Clang3.3,C++ 实现一:数组自增模拟 #include #include using namespace std; void pri原创 2013-08-02 22:06:08 · 1123 阅读 · 1 评论 -
剑指Offer算法实现之七:用两个栈实现队列
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队尾插入节点和在队首删除节点的功能。template class CQueue{ public: CQueue(); ~CQueue(); void appendTail(const T& node); T deleteHead(); private原创 2013-08-02 21:05:36 · 804 阅读 · 0 评论 -
剑指Offer算法实现之十一:数值的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需考虑大数问题。 思路: ① double判零技巧 ② 输入参数合法性 ③ 避免重复计算,迭代公式: 编译环境:ArchLinux+Clang3.3,C++11 实现一:迭代公式+位运算#include #include #i原创 2013-08-02 22:00:12 · 933 阅读 · 0 评论 -
剑指Offer算法实现之二十六:复杂链表的复制
题目:请实现一个函数ComplexListNode *Clone(ComplexListNode *pHead),复制一个复杂链表。在复杂链表中,每一个节点除了有一个m_pNext指针指向下一个节点外,还有一个m_pSibling指向链表中的任意接待你或者NULL。节点的C++定义如下:struct ComplexListNode { int m_nValue; ComplexLi原创 2013-08-04 21:40:40 · 867 阅读 · 0 评论