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