当面试官问我场景题、算法时,他们不希望看到我直接上手就写。
他们想慢慢的让我自己思考、与面试官交谈。
说出对这道题的理解。
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,需要判断多种情况,流程树。
所以我以后拿到题目,最开始不要想着用什么数据结构、算法来解决。而是专注于题目本身,需要我干什么。