看大神文章小结——微软等面试 39,40

大神 地址 :http://blog.csdn.net/v_JULY_v/article/details/6015165

39.
网易有道笔试:
(1).
求一个二叉树中任意两个节点间的最大距离,
两个节点的距离的定义是 这两个节点间边的个数,
比如某个孩子节点和父节点间的距离是 1,和相邻兄弟节点间的距离是 2,优化时间空间复
杂度。
(2).
求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,
有向图不再连通,描述算法。

第一题 貌似 前面做过了。

第二题 不会。。。和昨天一样 图 不大懂 先放一放


40.百度研发笔试题
引用自:zp155334877
1)设计一个栈结构,满足一下条件:min,push,pop 操作的时间复杂度为 O(1)。
2)一串首尾相连的珠子(m 个) ,有 N 种颜色(N<=10),
设计一个算法,取出其中一段,要求包含所有 N 中颜色,并使长度最短。
并分析时间复杂度与空间复杂度。
3)设计一个系统处理词语搭配问题,比如说 中国 和人民可以搭配,
则中国人民 人民中国都有效。要求:
*系统每秒的查询数量可能上千次;
*词语的数量级为 10W ;
*每个词至多可以与 1W 个词搭配
当用户输入中国人民的时候,要求返回与这个搭配词组相关的信息。


第一题 为什么 也这么眼熟。。push pop 铁定都是 O(1) 没问题 关键是min  其实 数据结构 加一个字段 记录这个对象入栈后 最小的min 就ok了。


二。我的思路是 选一个点 开始遍历 找到 从这个点出发 包含所有N中颜色的那一段。 然后 。 遍历下一个点 继续做。 复杂度有点高 思路很简单。空间 也只用了N个。

考虑一下 如何 优化  比如 先找到一个  1312345  这样的 (用 1,2,3,4,5  表示 5中颜色) 然后选下一个点 肯定需要 包含 312345 判断这个点 ok是否 就可以了。 不可  在加一个数 来判断。  

如何判断 是否都包含 必须用 map了  n用来做key  找到几个了 用来做 value 这样 复杂度 应该就降到 O(n)了。

public void test(int []data,int n){
		List list=new ArrayList<Integer>();
		int begIndex=0,endIndex=-1;
		int findCount=0;
		int minLength=0;
		//boolean isFind=false;
		Map dataMap=new HashMap<Integer, Integer>();
		for(int i=1;i<=n;i++){
			dataMap.put(i, 0);
		}
		while(begIndex<data.length){
			System.out.println(findCount);
			if(findCount==n){
				int d=data[begIndex];
				int value = (Integer)dataMap.get(d);
				if(value>1){
					//isFind=true;
				}else{
					findCount--;
					//isFind=false;
				}
				dataMap.put(d,value-1);
				begIndex++;
			}else{
				endIndex++;
				int d=data[endIndex%data.length];
				int value = (Integer)dataMap.get(d);
				//找到一个
				if(value==0){
					findCount++;
				}
				dataMap.put(d,value+1);
			}
			
			if(findCount==n){
				int length=endIndex-begIndex+1;
				//isFind=true;
				if(minLength==0){
					minLength=length;
				}else{
					minLength=Math.min(minLength, length);
				}
				System.out.println("beg:"+begIndex+"end:"+endIndex+"length:"+minLength);
			}
			
		}
		System.out.println("最小的是:"+minLength);
	}

ok  看了答案 一样的。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值