算法
文章平均质量分 73
rowandjj
阿里巴巴资深移动开发工程师
展开
-
哈希的妙用
如果需要判断多个字符是不是在某个字符串里面出现过或者统计多个字符在某个字符串中出现的次数,我们可以考虑基于数组创建一个简单的hash表,这样可以用很小的空间消耗来换取时间效率的提升。题目1:从第一个字符串中删除第二个字符串中出现的所有字符思路:准备一个hash数组,遍历第二个串,并以每个字符所对应的asc码作为下标,值为是否出现,1代表出现。然后遍历第一个串,每遍历一个原创 2014-08-18 17:37:12 · 1615 阅读 · 0 评论 -
8皇后问题
题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。请求出总共有多少种摆法。思路:一般是通过递归、回溯来求得,这里有一种新的方式,那就是通过全排列。由于八个皇后的任意两个不能处在同一行,那么这肯定是每一个皇后占据一行。于是我们可以定义一个数组ColumnIndex[8],数组中第i个数字表示位于第i行的皇后的列号。先原创 2014-08-08 19:58:16 · 1495 阅读 · 0 评论 -
树中两个结点的最低公共祖先
情况1:树为二叉排序树。思路:从根结点开始和输入的两个结点进行比较,如果当前结点的值比两个结点的值都大,那么最低的祖先肯定在左子树中,于是下一步遍历当前结点的左子结点。如果当前结点的值比两个结点的值都小,那么最低的祖先肯定在右子树种,于是下一步遍历当前结点的右子结点。如果当前结点正好是输入的两个结点之一,说明这两个结点有一个是另一个的祖先,这时输出当前结点的父节点即可。/*二原创 2014-08-21 10:51:28 · 1502 阅读 · 0 评论 -
字符串的组合
题目:输入一个字符串,求出其所有的组合。比如字符串abc,其组合为:a、b、c、ab 、ac、 bc 、abc。思路1:采用递归的思想,针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。思路2:我们可以把一个长度原创 2014-08-08 13:24:25 · 1226 阅读 · 0 评论 -
字符串的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入:每个测试案例包括1行。输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。输出:对应每组数据,按字典序输出所有排列。样例输入:abcBCA原创 2014-08-02 17:40:15 · 1299 阅读 · 0 评论 -
判断一棵二叉树是否是完全二叉树
题目:判断一棵二叉树是否是完全二叉树思路:1.首先明确完全二叉树的概念。完全二叉树除最后一层外,所有层结点数均达到最大值,最后一层结点连续集中在最左边。空树也是完全二叉树。2.我们可以通过层序遍历的方式遍历这个二叉树,使用一个队列存储遍历的结点。可以利用最后一层的结点集中在左侧这个特性解题,具体看代码:代码:bool isComple原创 2014-08-19 18:00:57 · 2721 阅读 · 0 评论 -
链表倒数第k个结点、链表中间节点、链表是否有环
题目描述:输入一个链表,输出该链表中倒数第k个结点。(hint: 请务必使用链表。)输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为两个整数n和k(0输入的第二行包括n个数t(1输出:对应每个测试案例,若有结果,输出相应的查找结果。否则,输出NULL。样例输入:原创 2014-07-31 16:11:38 · 1439 阅读 · 0 评论 -
二维数组中的查找
这一题给跪,c++死活超时。。。后来main函数改成用c就好了。。。算法:/*题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。输入:输入可能包含多个测试样例,对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入原创 2014-07-14 16:43:32 · 1107 阅读 · 0 评论 -
二叉排序树转化成双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。输入:输入可能包含多个测试样例。对于每个测试案例,输入的第一行为一个数n(0接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替。输出:对应每个测试案例,输出将二叉搜索树转换原创 2014-08-06 14:11:51 · 2726 阅读 · 0 评论 -
字符串转整数问题
要点:要考虑到各种非法参数。实现:/**********************************字符串转整数by Rowandjj2014/7/15***********************************/#include#include//不加这个头文件在九度oj上会编译错误using namespace std;int stat原创 2014-07-15 11:03:06 · 1209 阅读 · 0 评论 -
复杂链表的复制
题目:实现复杂链表的复制。在复杂链表中,每个结点除了有一个next指针指向下一个结点之外,还有一个sibling指向链表中的任意结点或者NULL。复杂链表示意图:思路:可以分成三步:1.根据原始链表的每个结点N创建对应的N',并将N'放到N的后面2.设置复制出来的结点的sibling指针假设P为原始链表的某结点,则复制链表的对应结点p'->sibli原创 2014-08-06 12:33:32 · 1542 阅读 · 0 评论 -
连续子数组的最大和
题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠原创 2014-08-11 09:58:37 · 1383 阅读 · 0 评论 -
最小的k个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。输入:每个测试案例包括2行:第一行为2个整数n,k(1第二行包含n个整数,表示这n个数,数组中的数的范围是[0,1000 000 000]。输出:对应每个测试案例,输出最小的k个数,并按从小到大顺序打印。样例输入:8 4原创 2014-08-10 09:58:46 · 1807 阅读 · 0 评论 -
基于中序遍历找到一个结点的后继结点
题目:基于中序遍历找到一个结点的后继结点。分析:首先明确中序遍历,顺序为:左--->根----->右假设当前结点为p。有两种情况:1.当p有右子树时,那么其右子树的最左结点即为所求:2.当p没有右子树时,有下面两种情况:沿着p向上找,如果p的父结点的左孩子是p,那么该父结点即为所求,否则继续向上找。原创 2014-08-19 15:05:42 · 3325 阅读 · 0 评论 -
不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。输入:输入可能包含多个测试样例。对于每个测试案例,输入为两个整数m和n(1输出:对应每个测试案例,输出m+n的值。样例输入:3 47 9样例输出:716代码:思路:1.先将两个数字异或得到原创 2014-08-17 13:38:34 · 1697 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目描述:统计一个数字在排序数组中出现的次数。输入:每个测试案例包括两行:第一行有1个整数n,表示数组的大小。1第二行有n个整数,表示数组元素,每个元素均为int。第三行有1个整数m,表示接下来有m次查询。1下面有m行,每行有一个整数k,表示要查询的数。输出:对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。样例输入:原创 2014-08-17 17:37:29 · 1379 阅读 · 0 评论 -
求两个单链表公共结点
题目:输入两个单链表,找出公共结点。思路:若两个单链表有公共结点,其形状必定为“Y”型,也就是说公共结点后的所有结点都是相同的。我们首先获得两个链表的长度,求得长度之差为n,再定义两个指针分别指向两个链表首部,长链表先走n步,然后两个指针同时走,直到两个指针所指向的值完全相同时停止。代码:/*求链表公共结点*/#include#inclu原创 2014-08-17 10:51:47 · 1823 阅读 · 0 评论 -
翻转单词顺序
题目描述:JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?输入:每原创 2014-08-16 10:13:42 · 2669 阅读 · 1 评论 -
左旋字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!输入:多组测试数据,每个测试数据包含一个字符序列S和非负整数K。其中S的长度不超过1000。原创 2014-08-16 13:45:15 · 1271 阅读 · 0 评论 -
数组中只出现一次的字符
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。输入:每个测试案例包括两行:第一行包含一个整数n,表示数组大小。2第二行包含n个整数,表示数组元素,元素均为int。输出:对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。样例输入:82 4 3 6 3 2 5 5原创 2014-08-14 10:29:09 · 1893 阅读 · 0 评论 -
和为s的两个数字
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输入:每个测试案例包括两行:第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 第二行包含n个整数,每个数组均为int类型。输出:对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”原创 2014-08-14 13:13:08 · 1317 阅读 · 0 评论 -
和为s的连续整数序列
题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输入:输入有多原创 2014-08-14 14:07:55 · 1437 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字,例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2},输出2。代码:/*数组中出现次数超过一半的数字by Rowandjj2014/8/9*/#includeusing namespace std;bool isValid = false;//检查数组是否合法b原创 2014-08-10 10:07:41 · 1612 阅读 · 0 评论 -
求二叉树深度
概念:1.二叉树深度:树中结点的最大层次称为树的深度或高度。2.二叉树层次:从根开始定义起,根为第一层,根的孩子为第二层,以此类推。要点:1.递归。2.二叉树深度为左右子树深度较大值+1。代码:/*求二叉树深度by Rowandjj2014/7/13-------------------------------题目描述:输入一原创 2014-07-13 13:56:06 · 1362 阅读 · 0 评论 -
判断二叉树是否平衡
题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。注:这里不考虑该二叉树是否是二叉排序树解决要点:1.后序遍历二叉树;2.递归。核心算法:bool isBalanced(pTree pT,int *depth){ if(!pT)//参数判断 { *d原创 2014-07-13 14:57:48 · 1290 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。比如:上面这棵二叉树,如果寻找和为22的路径,那应该有两条,首先是10,5,7,另外一条是10,12.思路:可以按照先序遍历的方式访问二叉树,这样可以确保根先于子树被访问到,另外需准备一个栈原创 2014-08-04 11:54:36 · 2434 阅读 · 0 评论 -
二进制中1的个数(2)
规律总结:把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中最右边的一个1变为0.题目1:用一条语句判断一个整数是不是2的整数次方。解决思路:如果一个整数是2的整数次方,那么二进制表示中只有一位是1。将这个数减去1之后再与本身,结果为0则表示这个整数位2的整数次方。bool func(int n){原创 2014-07-24 16:25:42 · 1277 阅读 · 0 评论 -
斐波那契数列
递归算法是不可取的,因为效率很低,而且还有栈溢出的风险。应该使用如下的迭代解法:int Fibonacci(unsigned int n){ if(n <= 0) { return 0; } if(n == 1) { return 1; } int i = 0,j = 1,m; unsigned int k; for(k = 2; k <=原创 2014-07-24 12:04:02 · 1352 阅读 · 0 评论 -
【剑指offer】员工年龄排序
典型的以空间换时间问题,思路很重要!/*员工年龄排序 员工可能有几万名,要求时间复杂度为O(n) 思路:员工的年龄必然在一个范围内,比如0-99,那么我们建立一个大小为100的辅助数组,然后遍历 员工年龄,取到一个年龄就将该年龄对应数组位置的值加1,最终数组中便保存了不同年龄的员工的个数 最后,打印数组即可。 by Rowandjj2014/7/22*/#includ原创 2014-07-22 15:50:24 · 1380 阅读 · 0 评论 -
旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。输入:输入可能包含多个测试样例,对于每个测试案例,输入的第一行为一个整数n(1输入的第二行包括n个整数,其中每个整数a的范围是(1输出:对应每个原创 2014-07-22 19:00:22 · 1048 阅读 · 0 评论 -
两个队列实现栈
原理:假设有两个队列Q1和Q2,当二者都为空时,入栈操作可以用入队操作来模拟,可以随便选一个空队列,假设选Q1进行入栈操作,现在假设a,b,c依次入栈了(即依次进入队列Q1),这时如果想模拟出栈操作,则需要将c出栈,因为在栈顶,这时候可以考虑用空队列Q2,将a,b依次从Q1中出队,而后进入队列Q2,将Q1的最后一个元素c出队即可,此时Q1变为了空队列,Q2中有两个元素,队头元素为a,队尾元原创 2014-07-21 13:40:32 · 1269 阅读 · 0 评论 -
两个栈实现一个队列
原理:假设有两个栈分别叫stack1,stack2。那么入队操作就是向stack1中push元素,出队操作就是将stack1中的所有元素pop出来,然后push到stack2中,对stack2进行pop操作。题目:题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。输入:原创 2014-07-21 11:03:12 · 1221 阅读 · 0 评论 -
重建二叉树
1.如何根据二叉树的先序遍历和中序遍历结果还原二叉树?比如,先序遍历结果是{1,2,4,7,3,5,6,8},中序遍历结果是{4,7,2,1,5,3,8,6};那么重建二叉树的过程如下: 1.先序遍历方式为:根->左->右.故1为根节点。中序方式为:左->根->右,所以4,7,2为左子树上的结点,5,3,8,6为右子树的结点。 2.经过步骤1,将原创 2014-07-19 15:06:16 · 2708 阅读 · 0 评论 -
从尾到头打印链表
题目描述:输入一个链表,从尾到头打印链表每个节点的值。输入:每个输入文件仅包含一组测试样例。每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。输出:对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。原创 2014-07-18 15:25:47 · 1020 阅读 · 0 评论 -
合并两个有序链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。(hint: 请务必使用链表。)输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为两个整数n和m(0下面一行包括n个数t(1输出:对应每个测试案例,若有结果,输出相应的链表。否则,输出N原创 2014-07-16 21:26:41 · 1226 阅读 · 0 评论 -
替换字符串中的空格
题目描述:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。输入:每个输入文件仅包含一组测试样例。对于每组测试案例,输入一行代表要处理的字符串。输出:对应每个测试案例,出经过处理后的字符串。样例输入:We原创 2014-07-16 14:14:42 · 1496 阅读 · 0 评论 -
打印从1到最大的n位数
题目描述:给定一个数字N,打印从1到最大的N位数。输入:每个输入文件仅包含一组测试样例。对于每个测试案例,输入一个数字N(1输出:对应每个测试案例,依次打印从1到最大的N位数。样例输入:1样例输出:123456789方案1:void func(int原创 2014-07-25 17:07:37 · 1243 阅读 · 0 评论 -
二进制中1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。输入:输入可能包含多个测试样例。对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。。n保证是int范围内的一个整数。输出:对应每个测试案例,输出一个整数,代表输入的那个数中1的个数。样例输原创 2014-07-24 16:09:40 · 1166 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。输入:每个测试案例包括2行:第一行为1个整数n(1第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。输出:对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes,否则输出原创 2014-08-03 13:59:49 · 1364 阅读 · 0 评论 -
包含min方法的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为一个整数n(1接下来有n行,每行开始有一个字母Ci。Ci=’s’时,接下有一个数字k,代表将k压入栈。Ci=’o’时,弹出栈顶元素。输出:对应每个测试案例中的原创 2014-08-02 15:16:15 · 1349 阅读 · 0 评论