微软100题(40)几道百度笔试题2

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

 

1)参考min函数栈

2)和找最短字符串使之包含字符集中所有字符有点类似。

bool GetMinlen(int *a,int m,int &shortHead,int & shortlen)  
{  
	int start=0,end = 0;  
	int countColor = 0;  
	int *colorArray = new int[N];  
	shortlen = m;  
	shortHead = 0;  

	for(int i =0;i< N;i++)  
	{  
		colorArray[i] = 0;  
	}  

	while(start < m)  
	{  
		//向后搜索直至所有的颜色均出现  
		while(countColor < N)  
		{  
			if(colorArray[a[end]]++ == 0)  
			{  	
				countColor++;  
			}  
			
			if(countColor <N)  
			{  
				if((end+1)%m!=start)
				   end=(end+1)%m;  
				else
					break;
			}  
		}  
		if(countColor != N)  
		{  
			cout << "珠子颜色数少于所要找的数目"<<endl;  
			return false;  
		}  
		//start向后移动,直到有一个颜色数为0  
		while(start<m)  
		{  
			if(colorArray[a[start]] > 1)  
			{  
				colorArray[a[start]]--;  
				start++;  
			}  
			else  
			{  
				break;  
			}  
		}  

		if(shortlen > ((end<start?(end+m):end) - start +1) )
		{  
			shortlen = (end<start?(end+m):end) -start +1;  
			shortHead = start;  
		}  
		if(start<m)
		{
			colorArray[a[start]]--;  
			start++;  
			countColor--;  
			end = (end+1)%m; 
		}		  
	}  

	return true;  
}  


 

#define N 3

int main()  
{  
	int start,len;  
	int m[] ={1,0,1,1,1,1,1,1,1,1,2}; 
	bool answer = GetMinlen(m,11,start,len);
	if(answer==true)
	    cout << "包含所有颜色的最短串 起点是" <<start<<" 长度是"<<len<< endl ;  
	return 0;  
}


3)转自http://blog.csdn.net/v_july_v/article/details/6126444

可以建立一个RDF文件,利用protege 4.0。或者自己写的RDF/XML接口也行。在其中建立两个“描述对象”一个是国家,一个是人民。 国家之下建立一个中国,人民。并且在关系中建立一个关系:对每个存在的国家,都have人民。这样,每当用户输入这两个词的时候,就利用语义框架/接口来判断一下这两个词汇的关系,返回一个值即可。

--贝叶斯分类--
其实贝叶斯分类更实用一些。 可以用模式识别的贝叶斯算法,写一个类并且建立一个词汇-模式的表。
这个表中每个模式,也就是每个词汇都设一个域,可以叫做most-fitted word,
然后对这个分类器进行训练。这个训练可以在初期设定一些关联词汇;也可以在用户每次正确输入查询的时候来训练。通过训练,每个单词对应出现概率最高的单词设到最适合域里面。然后对于每个词,都返回最适合的单词。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值