看每日微软面试题之若个题的思路总结

参考:http://blog.csdn.net/column/details/interviewms.html

本文是参考每日微软面试题系列资料来完成的。

1、题:.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。
分析:首先54张牌分别用0到53 的数值表示并存储在一个整形数组里,数组下标代表纸牌所在
的位置。接下来,遍历整个数组,在遍历过程中随机产生一个随机数,并以该随机数为下标的
数组元素与当前遍历到的数组元素进行对换。时间复杂度为O(n)


2、题:求随机数构成的数组中找到长度大于=3的最长的等差数列
输出等差数列由小到大: 
如果没有符合条件的就输出[0,0]
格式:
输入[1,3,0,5,-1,6]
输出[-1,1,3,5]
要求时间复杂度,空间复杂度尽量小
分析:基本算法思路(采用动态规划思想):首先,只要得到数列的公差和一个首项就可以确
定一个等差数列,因此我们要寻找最长等差数列的公差以及首项。其次,为了方便查找公差和
首项,我们应该将原数组进行由小到大排序,这样各两数之间的公差也是成递增形势的,这样
我们就可以避免回溯查找首项。


3、题:两个链表,一升一降。合并为一个升序链表。
分析:(假设升序的链表为链表1,降序的链表为链表2,p1,p2分别作为它们的迭代器,还有
一个合并链表用于存放合并后的数据)
法一、最容易想到的且容易实现的就是使两个表都变成升序,然后就是经典的合并排序算法的
步骤了,步骤是构建p1,p2两个迭代器,分别用于迭代两个链表,每次遍历,若p1所指的节点
数据大于p2所指的节点数据则将p1所指的节点数据插入到要合并链表中去且使p1指向下一个节
点,否则将p2将所指的节点数据插入到合并链表中去且使p2指向下一个节点,直到p1和p2任意
一个指向了NULL为止。最后可能两个链表中尚有剩余的节点,将其逐个插入到合并链表中去即可。

法二、使用递归方法后序遍历降序链表2,遍历顺序就相当于升序的顺序了。在递归遍历链表2
的过程中,需要处理有以下三件事:(注意顺序)
(1) 如果p2的数据小于p1的就插入到合并链表中
(2) 如果p2的数据大于p1,那么就对链表1循环遍历,每次将p1中的数据插到合并链表中,直到
p2不大于p1,且p1不为空
(3) 如果p1为空,就直接将p2插入到合并链表中
(这个方法你想到了没!)



4、题:如何删除链表的倒数第m的元素?
分析:构建p0,p1两个迭代器,初始使p0和p1指向头结点,接着使p1移动到第m+1项,然后指向
头得p0与p1同时前进,当p1指向空节点的时候结束,这时p0所指的位置就是倒数第m个,时间复
杂度为O(n)



5、题:1、如何判断一个字符串是对称的?如a,aa,aba。   
         2、如何利用2函数找出一个字符串中的所有对称子串?
分析:且看第一个问题判断字符串对称,有以下两种方法。
        方法一、使迭代器p1指向头,p2指向尾。使p1,p2相对而行(—> | <—),每次比较p1,p2是否相等,直到它们相遇。
        方法二、使p1、p2指向中间的一个元素(如果字符串长度为偶数的话就指向中间两个
相邻的元素),使它们相向而行(<— |—>),每次比较p1,p2是否相等。直到它们一个指向头
一个指向尾便结束。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值