
剑指offer
文章平均质量分 63
patkritLee
practice makes perfect.
展开
-
汉诺塔问题(python版)
汉诺塔的移动可以用递归函数非常简单地实现。请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,例如:算法:当只有一个盘子的时候,只需要将A塔上的一个盘子移动到C塔上。当A塔上有2个盘子的时候,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔的2号盘子移动原创 2016-10-31 15:27:47 · 3551 阅读 · 0 评论 -
二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:中序遍历。struct BinaryTreeNode{ int val; BinaryTreeNode* left; BinaryTreeNode* right;};BinaryTreeNode* Convert(BinaryTreeNode* pRoo原创 2016-10-14 14:39:36 · 540 阅读 · 0 评论 -
大数取余
//将“14689”看成多项式相加的和,即1*10^5+4*10^4+6*10^3+8*10^2+9*10^1,每一项如果看成X,Y,Z//结合一些模运算的性质来考虑,比如,对多个数字的相加再求模和先对中间部分结果求模再相加后面的数再求模的结果是一样的//即 (X+Y+Z)modP =((X+Y)modP+ Z)modP = ((XmodP +Y)modP+Z)modP/*原创 2016-09-27 09:06:29 · 702 阅读 · 0 评论 -
判断链表是否有环及找环
对应题一:141. Linked List CycleGiven a linked list, determine if it has a cycle in it.Follow up:Can you solve it without using extra space?分析:最容易想到的方法,用一个哈希表unorderd_map visited,记录每个元素是否原创 2016-09-19 09:33:02 · 405 阅读 · 0 评论 -
数值的整数次方
bool isvalid = false;double pownum(double base,int component){ isvalid = false; if (equals(base, 0.0) && component < 0){ isvalid = true; return 0.0; } double result; unsigned int absComponen原创 2016-08-21 13:07:45 · 343 阅读 · 0 评论 -
字符串的全排列
对应剑指offer中的面试题28:字符串的排列题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。思路:我们求整个字符串的排列,可以看出两部:首先求出可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。拿ABC做例子,也就是将A分别和B、C交换,得到BAC原创 2016-08-11 16:15:40 · 419 阅读 · 0 评论 -
数组中的逆序对
利用归并排序的原理,先计算内部的逆序对,然后每次合并的时候,计算新的组合逆序对int InversePairs(int* data,int length){ if (data == NULL || length < 2) return 0; int* copy = new int[length]; for (int i = 0; i < length; i++){ copy[i] =原创 2016-08-11 13:34:21 · 382 阅读 · 0 评论 -
二叉树的任意两节点间的最大距离
1.问题定义如果我们把二叉树看成一个图,父子结点之间的连线看成是双向的,我们姑且定义“距离”为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个结点之间的距离2.解法计算一个二叉树的最大距离无外乎两种情况:A. 路径经过左子树的最深结点,再通过根节点,最后到右子树的最深结点。B. 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其最大者。s原创 2016-08-09 15:02:53 · 5290 阅读 · 1 评论 -
设置栈的min或者max方法
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)分析:看到这个问题,第一反应可能是每次压入一个新元素进栈时,将栈里的所有元素排序,让最小的元素位于栈顶,这样就能在O(1)时间得到最小元素了。但这种思路不能保证最后压入栈的元素能够最先出栈,因此这个数据结构已经不是栈了。我们接着想到在栈里添加一个成原创 2016-08-09 09:12:23 · 783 阅读 · 0 评论 -
两个有序单链表的合并&两个有序数组的合并
1.两个有序单链表的合并typedef struct ListNode{ int val; ListNode* next;}ListNode;ListNode* mergeList(ListNode* pHead1,ListNode* pHead2){ if (pHead1==NULL) return pHead2; if (pHead2 == NULL) return pHea原创 2016-08-09 08:29:20 · 1189 阅读 · 0 评论 -
二叉树中和为某一值的路径
例子:10 5 12 4 7由于路径是从根节点出发到叶结点,也就是说路径总是以根节点。在树的前序、中序、后序三种遍历方式中,只有前序遍历是首先访问根节点的。按照前序遍历的顺序遍历上图,在访问结点10之后,就会访问结点5。从二叉树结点的定义可以看出,在本体的二叉树结点中没有指向父节点的指针,访问到结点5的时候原创 2016-08-08 22:57:25 · 422 阅读 · 0 评论 -
数组循环右移
设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。不合题意的解法如下:我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次。abcd1234→4abcd123→34abcd12→234abcd1→1234abcd。伪代码如下:代码清单2-33 RightShift(int* arr,原创 2016-08-08 19:35:54 · 559 阅读 · 0 评论 -
复杂链表的复制
Q:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。A:一开始想这道题毫无思路,如果蛮来,首先创建好正常的链表,然后考虑sibling这个分量,则需要O(n^2)的时间复杂度,然后一个技巧便可以原创 2016-08-08 12:52:35 · 556 阅读 · 0 评论 -
找出两个排序数组的中位数
#include "stdafx.h"#include using namespace std;/*找出两个排序数组的中位数输入:两个排序的数组输出:它们的中位数思路:中位数概念:一个长度为n的数组,如果n是奇数,则中位数在(n-1)/2处如果n是偶数,则中位数为(n-1)/2和n/2这两个数,我们一般取下分位(为了统一)则a和b的下中位数(分奇数偶数位)应该是合并后,有c原创 2016-08-07 23:00:30 · 765 阅读 · 4 评论 -
删除链表中重复的元素
题意:在一个排序的链表中,如何删除重复的结点?例如(a):1 2 3 3 4 4 5(b):1 2 5// test1.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespace std;#include using namespace std;/*删除链表中重复的元素*/原创 2016-08-07 21:11:33 · 641 阅读 · 3 评论 -
在1-10000中,有9998个数已知,找出未知的两个
先用公式n(n+1)/2算出1-10000的总和 , 用公式n(n+1)(2n+1)/6算出1-10000的平方和,然后扫描那9998个数,每扫到一个就从平方和中减去这个数的平方,扫描一个就从总和中减去这个数。 知道两个数的和和平方和,解方程组即可得出这两个数原创 2016-08-03 11:26:46 · 1015 阅读 · 0 评论 -
面试题6:重建二叉树(根据前序遍历和中序遍历)
/*面试题6:二叉树的重建题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历中都不含重复的数字。例入输入:前序遍历{1,2,4,7,3,5,6,8} 中序遍历{4,7,2,1,5,3,8,6}思路:在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。但在中序遍历中,根节点的值在序列的中间,左子树的结点的值位于根节点的值的左边,原创 2016-07-23 10:31:26 · 574 阅读 · 0 评论 -
面试题4:字符串_空格替换
/*面试题4:替换空格题目:请实现一个函数,把字符串中的每一个空格替换成"%20"。例子:Input: "We are happy."Output: "We%20are%20happy."*/void replaceblank(char string[],int length){//length为string的总容量 if (string == NULL || lengt原创 2016-07-23 09:54:07 · 486 阅读 · 0 评论 -
面试题总结:链表类型
单向链表的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;}往该链表的末尾添加一个结点的C++代码如下:ListNode *AddTail(ListNode** pHead,int value){ if(pHead==NULL) return NULL; ListNode *pNew=new ListNode原创 2016-07-22 19:38:39 · 518 阅读 · 0 评论