微软100题算法解答

来源:互联网 发布:淘宝主视频制作软件 编辑:程序博客网 时间:2024/05/04 08:06

本文是旨在实践”用关键变量、循环把握算法”的思路。用以变量为中心的方法把握算法,取而代之空间想象推演的方法

1.把二元查找树转变成排序的双向链表

变量:全局变量head, end

算法框架: 中序遍历。

变量算法:1) head变量:如果head为null, head指向当前结点,只执行一次。

       2) end 变量: 如果end为null, end 指向当前节点;否则end->right 指向当前结点,当前结点的left指向end。end 赋值当前结点


2.设计包含min函数的栈

变量:内置一个一般stack1, 正常存取数据。另设一个stack2,栈顶保存stack1当前状态对应的最小值。

push算法:stack2为空,stack2 push当前值;否则比较stack2.peek()和当前值,如果当前值小于stack2.peek(),stack2 push当前值。

pop算法:pop出的值和stack2栈顶比较,如果不等于stack2栈顶的值,stack2不做操作。如果等于stack2栈顶的值,stack2也pop

min算法:返回stack2.peek()


4.在二元树中找出和为某一值的所有路径(树)

变量:参数root, sum。另设一个全局变量path vector保存从根节点到当前结点的路径

算法框架:前序遍历。

访问结点算法:path append当前结点,sum 减去当前结点的值。如果sum 为0,打印path

当前树处理完后,path remove当前结点


5.查找最小的k个元素

变量:参数:数组a, 数组大小n, k

算法框架:前k个数构建大小为k的最大堆,后面的数依次和堆顶比较,如小于堆顶则替换堆顶并fixdown

1) heapfy(a,k)  2)i= k, n-1, 比较,fixdown(a,0,k)



6 判断整数序列是不是二元查找树的后序遍历结果

变量 :参数a[], n;局部变量:  循环变量i,

边界情况:n<=1 返回true

1)i从0到n-2扫描a[], 当a[i]大于等于根a[n-1] 停止; 此时i停留在右子树的第一个结点上

2)verify 右子树值均大于等于a[n-1],否则返回false

3)对左右子树递归调用本算法。注意a,和n的新取值。


7翻转一个句子

变量:参数char* a;   局部变量 :char* p 字符指针,wordStart 指针保存当前word的起始,prev表示上一个字符初始化为NULL

算法:1) 用指针p遍历字符,如果当前字符非空格而下一字符是空格或者结束符,说明是word的最后一个字符,从wordStart到p之间reverse。如果当前字符非空格,prev是 空格,更新wordStart=p。

    2)reverse整个字符串。


8 二叉树结点最大距离

maxLen(树)= max( maxLen(左子树),maxLen(右子树),depth(左子树)+ depth(右子树))



0 0
原创粉丝点击