【搞定算法】机器人走路问题

浅浅的花香味﹌ 2021-11-22 03:50 373阅读 0赞

博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java 一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。

给定四个参数N、P、M、K。表示:
N : 一共有1~N个位置
P : 一共有P步要走
M : 机器人初始停留在M位置上
K : 机器人想要去的位置是K
题目:已知,如果机器人来到 1 位置,那么下一步一定会走到 2 位置。如果机器人来到 N 位置,那么下一步一定会走到 N - 1 位置;如果机器人在中间的位置,那么下一步既可以走向左,也可以走向右。请返回,机器人如果初始停留在 M 位置,经过 P 步之后,机器人来到 K 位置的走法有多少种。

  • 递归实现

    public class RobotWork {

    1. /**
    2. * @param N :共N个位置
    3. * @param M :开始位置
    4. * @param P :可以走的步数
    5. * @param K : 目标位置
    6. * @return
    7. */
    8. public static int walk(int N, int M, int P, int K){
    9. if(P == 0){
    10. // basecase
    11. return M == K ? 1 : 0;
    12. }
    13. // 开始位置和结束位置只能往一个方向走
    14. if(M == 1){
    15. return walk(N, M + 1, P - 1, K);
    16. }else if(M == N){
    17. return walk(N, M - 1, P - 1, K);
    18. }
    19. // 向左走和向右走两种选择
    20. return walk(N, M + 1, P - 1, K) + walk(N, M - 1, P - 1, K);
    21. }

    }

  • 动态规划实现

    public class RobotWork {

    1. public static int walkDP(int N, int M, int P, int K){
    2. // 从递归的过程看:变量有 M 和 P
    3. int dp[][] = new int[N + 1][P + 1];
    4. // basecase:当在目标位置,还剩一步的时候
    5. dp[K][0] = 1;
    6. for(int j = 1; j <= P; j++){
    7. for(int i = 1; i <= N; i++){
    8. if(i - 1 < 1){
    9. // 在第一个位置上
    10. dp[i][j] = dp[i + 1][j - 1];
    11. }else if(i + 1 > N){
    12. // 在最后一个位置上
    13. dp[i][j] = dp[i - 1][j - 1];
    14. }else{
    15. dp[i][j] = dp[i + 1][j - 1] + dp[i - 1][j - 1];
    16. }
    17. }
    18. }
    19. return dp[M][P];
    20. }

    }

发表评论

表情:
评论列表 (有 0 条评论,373人围观)

还没有评论,来说两句吧...

相关阅读

    相关 前端如何算法面试?

    前言 曾几何时,前端面试开始考一些数据结构与算法题目。 这股风气貌似是字节跳动带起来的,我认为这是好事,因为这会促使更多的前端不再把自己当成切图仔,而是真正的程序员。