当面试官问我场景题、算法时,他们不希望看到我直接上手就写。
他们想慢慢的让我自己思考、与面试官交谈。
说出对这道题的理解。
LCP 03. 机器人大冒险
如下:
这道题,它的目的是求出机器人是否能够安全到达终点。
其中只需要判断:1、机器人能到达终点;2、机器人不会撞墙
思路最简单的方法是:模拟机器人,一步一步的走。当撞墙或者远离终点时,就返回false。到达终点则返回true。(没超时,985ms)
另一种思路:用数学的方法,优化时间复杂度,只需要判断1、能否到达终点;2、是否撞墙;即可。(0ms)
class Solution {
// 1、不撞墙;2、能到达终点
int n;
public boolean robot(String command, int[][] obstacles, int x, int y) {
this.n = command.length();
int sx = 0, sy = 0;
for (int i = 0; i < n; i++) {
if (command.charAt(i) == 'U')
sy++;
else
sx++;
}
// 是否能到达终点
if (!canReach(command, x, y, sx, sy))
return false;
// 是否撞墙,如果墙在终点之外,则无需判断
for (int[] obstacle : obstacles) {
if (obstacle[0] > x || obstacle[1] > y)
continue;
if (canReach(command, obstacle[0], obstacle[1], sx, sy)) {
return false;
}
}
return true;
}
public boolean canReach(String cmd, int tx, int ty, int x, int y) {
int round = Math.min(tx/x, ty/y);
int nx = round * x, ny = round * y;
if (nx == tx && ny == ty)
return true;
for (int i = 0; i < n; i++) {
if (cmd.charAt(i) == 'U')
ny++;
else
nx++;
if (nx > tx || ny > ty)
return false;
if (nx == tx && ny == ty)
return true;
}
return true;
}
}
我每次拿到一个算法,就直接去想解法,dfs、bfs、动态规划、贪心、并查集。而忽略了题目本身。这样做出来的答案,不会是最优解。
我拿到一道题时,需要把这道题的解答流程写出来,比如这道题就是:1、判断可以到达终点;2、判断是否会撞墙。
比如状态题:股票买卖1~5,需要判断多种情况,流程树。
所以我以后拿到题目,最开始不要想着用什么数据结构、算法来解决。而是专注于题目本身,需要我干什么。