算法
Roger_Jin
这个作者很懒,什么都没留下…
展开
-
设计包含min函数的栈的理解
题目: 设计包含min函数的栈。 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1).理解: 为了满足三个函数的时间复杂度都是O(1),该栈类设计了2个链表,分别保存数据和最小数据,但是增大了系统的空间开销,空间换时间 如果去掉时间复杂度原创 2012-02-03 13:49:30 · 531 阅读 · 0 评论 -
输入一个已经按升序排序过的数组和一个数字
题目:在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。解法: 建立2个索引,一个指向头,一个指向尾,头尾相加跟sum判断,小于sum的尾部减一,大于sum的头部加一即可。代码:void f转载 2012-02-19 21:18:56 · 626 阅读 · 0 评论 -
从上往下打印树节点
题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入 8 / \ 6 10/ \ / \5 7 9 11 输出8 6 10 5 7 9 11。解法1: 采用 STL 的map,从上到下保存节点地址即可。解法2:采用 STL 的 FIFO 的queue, 保存节点打印即可。解法2代码:vo原创 2012-02-19 21:24:01 · 532 阅读 · 0 评论 -
输入整数的字符串,输出相应的整数
题目: 输入整数的字符串,输出相应的整数解法要点:1. 判断字符串整数的正负号2. 如遇到整数字符串中有别的符号,则输出03. 输入的字符串可能大于int类型的范围,考虑正溢出和负溢出4. 在字符串中单个字符变为整数则要减去'0'5. 判断输入的字符串指针的有效性注意:csdn上关于该题没有判断负溢出的情况代码如下:int prin原创 2012-02-24 15:10:39 · 1708 阅读 · 0 评论 -
翻转句子中单词的顺序。
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。解法:此题比较简单void revertChar(char *a){int len = strlen(a);int j = len;for原创 2012-02-10 13:33:20 · 445 阅读 · 0 评论 -
求二叉树中节点的最大距离
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。思路:运用递归算法即可,void maxedge(BSTree root, int& icount, int& maxnum){if (root == NULL)return;++ico原创 2012-02-10 13:58:12 · 456 阅读 · 0 评论 -
判断整数序列是不是二元查找树的后序遍历结果
判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历转载 2012-02-09 16:31:11 · 401 阅读 · 0 评论 -
查找最小的k个元素的自写算法
题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4解题:1, 通过排序数组,然后取前k个数据 时间复杂度为O(n^2) 2, 通过循环k次,找出最小的k个数据,时间复杂度为:O(n*k) 3, 如果提前知道要输出的k个数据,则建立k个变量,依次取出,时间复杂度为O(n)1.原创 2012-02-06 19:58:41 · 488 阅读 · 0 评论 -
判断俩个链表是否相交
微软亚院之编程判断俩个链表是否相交给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。问题扩展:1.如果链表可能有环列?2.如果需要求出俩个链表相交的第一个节点列?1,如果没环,判断两链表是否相交即可通过最后的节点是否相等即可2,如果有环,先选择一链表,以两指针,一个步长为1,另一个步长为2,找出相交转载 2012-02-08 13:03:09 · 599 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径的个人代码
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / \ 5 12 / \ 4 7则打印出两条路径:10, 12和10, 5, 7。content: 保存节点路径// 该算法运用了二叉树后序原创 2012-02-06 11:06:53 · 491 阅读 · 0 评论 -
对求子数组的最大和
求子数组的最大和题目描述:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18该题简单,但我还是没做出,转载 2012-02-05 13:41:38 · 436 阅读 · 0 评论 -
对旋转字符串算法的理解
题目描述:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdefg左旋转2位得到字符串cdefgab。请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。 描述: 1,如果旋转k位,则时间复杂度位O(N*K); 即:while(K--){原创 2012-02-02 15:10:45 · 916 阅读 · 0 评论 -
关于把二元查找树变成排序的双向链表算法的理解
把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \4 8 12 16 转换成双向链表4=6=8=10=12=14=16。1.根据算法面试,楼主v_JULY_v给出的答案中函数addBSTreeN原创 2012-02-02 17:40:40 · 585 阅读 · 0 评论 -
求1+2+...+n
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。解法: 采取模版元编程即可。代码:template struct binary{static int const value = binary::value + N;};templatest转载 2012-02-19 21:21:06 · 436 阅读 · 0 评论