每天一道逻辑思维题

Posted on 2013-08-01 18:53  冰天雪域  阅读(379)  评论(0编辑  收藏  举报

1、有N个人,其中一个明星和n-1个群众,群众都认识明星,明星不认识任何群众,群众和群众之间的认识关系不知道,现在如果你是机器人R2T2,你每次问一个人是否认识另外一个人的代价为O(1),试设计一种算法找出明星,并给出时间复杂度(没有复杂度不得分)。(2013年阿里巴巴暑期实习招聘笔试题)

算法1:明星不认识任何人
i不认识剩余的所有人,则i为明星,否则i不是明星,舍弃i.算法复杂度O(n*n)

for i=[0,n-1){
   flag=false; //标识i是否认识其他人,如果有认识的人则标识为true
   for j=[1,n){
       if(i认识j){
	      flag=true;
	      break;
	   }//end if
   }//end for
   
   //判断i是否有认识的人
   if(flag==false)
      return i;    //如果i在剩余的人中没有认识的人,则为明星
}//end for

算法2: 关键点在只有一个明星。首先分析一次询问的效果,询问一次有2种结果:
1)A认识B->A不是明星,B可能是明星
2)A不认识B->A可能是明星,B不是明星
所有不管是上述哪种结果,都可以确定一个人不是明星,所以要确定明星, 时间复杂度为O(n)。

代码1:
数据结构设计:因为每次判断可以舍弃那个不是明星的人,所以可以用栈或队列出栈或出队列来舍弃那个没用的元素,因此,可以用栈或队列来存储初始化的元素。

 

//判断结果,result中存储每次判断可能是明星的那个人,当栈中所有元素出栈完毕,则result中为明星那个人
result=0; //i=0,初始化
//初始化栈,入栈
for i=[1,n) {
  stack.push(i);
}//end for


while(!stack.isEmpty()){
    temp=stack.pop(); //出栈
	//判断结果
	if(temp 认识 result) //result可能是明星
	  result=result;
	else                 //temp 不认识 result,则temp可能是明星
	  result=temp;  
}//end while

 

2、n*m矩阵中有多少个长方形? (2013年微软暑假实习)
n排列*m排列,(1+2+...+n)(1+2...+m)

3、n长度的字符串有多少个子字符串
分析:如abcdef,以a开头的有n个子字符串,以b开头的有n-1个子字符串,....,所以共有n+(n-1)+...+1

4、战报交流:战场上不同的位置有N个战士(n>4),每个战士知道当前的一些战况,现在需要这n个战士通过通话交流,互相传达自己知道的战况信息,每次通话,可以让通话的双方知道对方的所有情报,设计算法,使用最少的通话次数,是的战场上的n个士兵知道所有的战况信息,不需要写程序代码,得出最少的通话次数。(2013年阿里巴巴暑期实习招聘笔试题)
问题描述:设士兵i和j拥有的信息分别为a[i]和a[j](0<=i<n,0<=j<n),则i和j交换信息后各自的信息都翻倍了,信息量变为a[i]+a[j]。现在求最小交换次数,使得每个人最后得到总信息量sum(a[0]+a[1+...+a[n-1]])
算法1:基于中间消息人传递的模型(可以先把所有消息集中于一个或几个人,然后再由这些消息汇总人把消息传给所有人)
第1到第N-1个人,将知道的消息都告诉第N个人,需要N-1次。这时,第N个人有了所有人的消息,然后他将拥有的消息分别都告诉剩余的N-1个人。所以需要(N-1)+(N-1)=2N-2。

5、1条直接将区域分为2部分,2条直线将区域分为4部分,n条直线将区域分为几部分?假设不存在三条直线相较于一点的情况。(微软2013暑期实习笔试题)

分析见《编程之美》光影切割问题,这里写出结论:

根据递推可以得出,如果总共有N条直线,M个交点,那么区域的数目为N+M+1。



 

Copyright © 2024 冰天雪域
Powered by .NET 9.0 on Kubernetes