注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
最近半年一直都在刷题。lc周赛积分大概在2000左右,虽然不高但是想着面试应该够了。两三周前在密集面试几家公司,绝大部分都挺好,其中有一家大厂的phone,三哥给了我这么道题,写的我怀疑自己是不是还是太菜了:
```
有一条和X轴平行的路。给你一个width表示这条路的宽度。另外给出若干个矩形,每个矩形用2对x-y坐标表示出左上角和右下角的点。矩形是障碍,会堵住这条路。要求返回一个boolean值,判断道路是否通畅。
譬如说路宽100,给的矩形是 [0, -5, 10,100]这条路就被堵上了。如果是 [0, 1, 10,100]就没堵上。
```
这道题确实没有什么复杂算法,用来phone也不过分。但是写着写着我就觉得不太对了:- 从最左边Dijkstra一层一层扩散到最后边肯定不行。道路宽度是width,万一width很大非常浪费资源。面试官可以说空间复杂不是最优,算法资源浪费太重,挂掉。
- 从X最小的那一列一点点往右判定也不行。万一矩形稀疏,或者分散在0 - 1e9这种很长的空间内,面试官还是以不是最优解可以挂掉你
- 从最左矩形开始一个一个矩形evaluate看有没有block。同时用一个List<int[]>来追踪当前x的道路通常坐标。
这个是我感觉最有希望的。也可能是我速度还是不行,写起来时间根本就不够。我花了大概30分钟连说带写,写了这一套流程:- 首先让矩形的竖边进行排序,按照x坐标从左到右排好。同时区分清楚是矩形的左竖边还是右竖边。
- 对那些竖边一个个进行遍历。对上一个List<int[]>组合成下一个List<int[]>。譬如说原本是[0,100]都是通的,遇到一个竖边从10到20的矩形,就会变成[0,10],[20,100]。
- 如果任何时候List<int[]>空了就返回否。
. 1point 3 acres
后面那部分就相当于一道加强版的蠡口武刘了。另外test case也必须自己写。绝大部分自己想到的test case都过了。面试官画了草图让我自己算出他画的8个矩形的坐标,一共是16个点。最后5分钟发现有一个边界情况没考虑到,两三行代码修一下估计时间也来不及,就说了下想法,面试官说ok。然后两天后拒信发到邮箱。
. Χ
这两天反省了一下,越想越不明白是不是自己太菜的。因为这道题算法并不难,edge case也不难想,被挂确实不冤。但是怎么感觉写起来这么难受。而且我想到的3个解法中,前两个写出来也有借口挂掉你,最后一个写起来很难在有限时间内写一个完整的code。
.
所以到底是我太菜还是三哥面试官故意挑的这道看着简单写着麻烦的题恶心人的?如果是后者,我整理一下这道题以后面三哥用了。
|