逻辑思维题

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

算法一:明星不认识任何群众,而群众都认识明星,所以只有明星满足“不认识任何其他人”。时间复杂度O(N^2)

for i in range(0,N):
	flag = true
	for j in range(0,N):
		if R2t2(i,j):
			flag = false
			break
	if flag==true:
		return i

算法二:一次询问有两种结果,如果i认识j,i不是明星,j可能是明星,排除i;如果i不认识j,i可能是明星,j不是明星,排除j。也就是说每次总能排除掉一个人不是明星,所以时间复杂度为O(N)

实现1:使用一个bool数组标志是否已经被排除

for i in range(0,N):
	bool flag = [1]*N
	for j in range(0,N):
		if flag[i]==1 and flag[j]==1:
			if R2t2(i,j):
				flag[i] = false
			else:
				flag[j] = false
	if flag==true:
		return i
实现2:

for i in range(1,N):
	start = 0
	if R2t2(i,start):
		pass
	else:
		start = i
    return start

2、战报交流:战场上不同的位置有N个战士(n>4),每个战士知道当前的一些战况,现在需要这n个战士通过通话交流,互相传达自己知道的战况信息,每次通话,可以让通话的双方知道对方的所有情报,设计算法,使用最少的通话次数,是的战场上的n个士兵知道所有的战况信息,不需要写程序代码,得出最少的通话次数。(2013年阿里实习笔试)

思路:分成两组,A组有k个人(k>=2),B组有N-k个人。第一组从第一个人一次与后面的人交流,到k-1次时最后两个人都知道了A组的所有战况;同样B组经过N-k-1次之后,也有两个人知道了B组所有战况;再经过两次交流后,这四个人就都知道了所有战况。剩余N-4人与四人中的任何一个交流,经过N-4次就全都知道所有战况。所以共需要k-1+N-k-1+2+N-4=2*N-4次通话。详细的分析后很容易发现,更多的分组不会带来次数的减少,仍然需要2*N-4次。

如果采用第一个人和N-1人通话的方式,N-1次通话之后有两个人知道所有战况,剩下N-2个人至少还需要N-2次通话,所以共需要2*N-3次通话,大于2*N-4,肯定不是最优。

3、1条直线把平面分成两部分,2条直线最多可将平面分成4个部分,3条直线最多可将平面分成7个部分,4条直线最多可将平面分成几个部分?,n条呢?

解答:设n条直线将平面分为T(n)个部分

T(1)=2,T(2)=4,T(3)=7,T(4)=11...

T(2)-T(1)=2,T(3)-T(2)=3,T(4)-T(2)=4...->T(n)-T(n-1)=n

T(n)=T(n-1)+n=T(n-2)+n-1+n=T(1)+2+3+4+...+n=n*(n+1)/2+1

4、一个双人游戏,游戏在一个圆桌上进行。每个游戏者都有足够多的硬币。他们需要在桌子上轮流放置硬币,每次必需且只能放置一枚硬币,要求硬币完全置于桌面内(不能有一部分悬在桌子外面),并且不能与原来放过的硬币重叠。谁没有地方放置新的硬币,谁就输了。游戏的先行者还是后行者有必胜策略?这种策略是什么?

解答:先行者有必胜的策略。策略:先行者首先将一枚硬币放在圆桌中心,以后每次都放在后行者所放位置的对称位置,只要对方还可以放,就一定会有一个对称位置可以放。

5、一个矩形蛋糕,蛋糕内部有一块矩形的空洞。只用一刀,如何将蛋糕切成大小相等的两块?

解答:只要直线过矩形的中心(两条对角线的交点)就一定可以把矩形等分,因此找到矩形空洞和矩形蛋糕的中心,按照连接两个中心的直线切开即可等分。

6、用线性时间和常数附加空间将一个长度为n的字符串向左循环移动m位(例如,”abcdefg”移动3位就变成了”defgabc”)。

解答:将字符串分为m位和n-m位的两部分,首先两部分分别进行字符倒序,然后在整体进行字符倒序。

7、用线性时间和常数附加空间将一篇文章的单词(不是字符)倒序。

解答:首先将这篇文章的所有字符倒序,第一个和倒数第一个交换,第二个和倒数第二个交换...然后在每个单词内部进行同样的操作(可以使用空格很容易的分开每个单词)即可。

8、A:一个大小为N的数组,所有数都是不超过N-1的正整数。用O(N)的时间找出重复的那个数(假设只有一个)。B:一个大小为N的数组,所有数都是不超过N+1的正整数。用O(N)的时间找出没有出现过的那个数(假设只有一个)。

解答:A求出这N个数的和以及(1+2+...+N-1),两者的差值即为重复出现的那个数;B求出1到N+1的和(1+2+...+(N+1)),减去N个数的和即为没有出现的那个数。

9、地球上有多少个点,使得从该点出发向南走一英里,向西走一英里,再向北走一英里之后恰好回到了起点?

解答:北极点;以南极点为圆心半径为(1+1/(2*π))的圆上的所有点。画一下图就明白了,请自行脑补。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值