做了一下微软2016校园招聘4月在线笔试的题目, 一共3个题目, 2.5h.下面是笔试题目的思路和代码。
1. Font Size
阅读电子书,屏幕大小为W*H, 一本电子书有N段, 每段字数ai。我们可以设置一个字符的大小x*x,使得电子书的显示出来的页数不超过P。我们来求满足条件取得最大的x。一行显示的字符个数W/x,一页显示的行数H/x,分别取下整。
我们可以想到用二分字符大小的方法,来找到最大的x。
1 |
|
2.403 Forbidden
背景是给出一个网站若干个允许访问和拒绝访问的IP地址和掩码位数。之后给出询问的IP地址,从他给出的allow或者deny中匹配,匹配到第一个就返回,如果限制条件中没有,就返回allow。
但是要注意几个trick.
- 要从上到下依次匹配,匹配到第一个就返回。
- 如果有多个一样的匹配,实现的时候一定不要覆盖掉,要保存第一个。
可以用字典树(这里也就是二叉树)来实现,考虑上面提到的trick,所以在询问的时候,要询问到底,不能碰到第一个符合条件的就返回,要返回次序最小的限制。
1 |
|
3.Demo Day
给你一个N*M大小的图,里面只有.
和b
两种,.
代表可以走,b
代表有障碍。机器人只能从左上出发,开始向右走,碰到障碍或者到了图的最右面就往 下走,然后碰到障碍或者到了图的最下面就往右走…………出口在右下角。
现在你可以把某个.
换成b
或者把b
换成.
。问最少进行几次这样的操作,可以使得机器人可以顺利的从入口走到出口。
1<= N, M <= 100.可以考虑动态规划。dp[i][j][k] 表示到达第i行第j列当前方向为k(右或下)采用的最少操作。
在(i, j)时候方向为右,要么从(i,j-1)方向为右的状态转移过来;要么从(i-1,j)方向为下的状态转移过来,这时候如果(i+1,j)不为b
要把它置为b
。同理,(i, j)方向为下时,要么从(i-1,j)方向为下的状态转移过来;要么从(i,j-1)方向为右的状态转移过来,这时候如果(i,j+1)不为b
,要把它置为b
。
代码:
1 |
|
4.Building in Sandbox
在一个三维空间里面建造东西,每次摆一个方块。每次摆的时候满足两个条件:
*每摆放一个方块要么和地面相邻,要么和之前摆放好的方块相邻
*可以从外面(可以考虑为(1000, 1000, 1000))不通过其他木块,不通过地面,能够走到当前摆放的位置。每次走有UP,DOWN,LEFT,RIGHT,FORWARD,BACKWARD留个方向。
题目给定一个摆放顺序和位置。问这个顺序摆放是否合理。
对于第一个限制条件,比较好检测,每次摆放的时候检查一下周围留个方向就可以;对于第二个限制条件,就不能考虑依次摆放的顺序了。要考虑逆序,对于最后一个是否可以到达比较远的点(101, 101,101),如果可以到达,把这个方块去掉,考虑倒数第二个方块是否可以到达比较远的点…………如果其中有一个不可到达,结果就是NO
。对于如何判断是否可以到达(101, 101, 101)这个点,我们可以用并查集解决。如果用不加优化的BFS 或 DFS应该会TLE。实现的时候注意最下面一排(地面)的处理。
1 |
|
小结
这些题目并不是太太难,并没有复杂的数据结构,没有思路上或者实现上非常难的算法。但是如果要在2.5h内完美的解决还是需要比较好的代码能力和清晰的思路。而这些都需要自己不断的锻炼和保持的。