1024 奇妙冒险全结局 + jsliang 自定义算法题目

1,061 阅读3分钟

目录

不折腾的前端,和咸鱼有什么区别

目录
前言
故事线
故事开始
结局 A
结局 B
结局 C
结局 D
结局 E
少侠,接招!

前言

返回目录

作为一枚每天坚持刷 LeetCode 的游戏爱好者,今天发现 LeetCode 搞了个活动,所以将它的全攻略打出来了!

这个活动有 5 个好结局,其他都是 Bad End,Bad End 需要做 LeetCode 的第 1024 题才能解脱。

最后 jsliang 根据这些结局,出了一道题,感兴趣的小伙伴可以尝试挑战~

故事线

返回目录

故事开始

返回目录

结局 A

返回目录

结局 B

返回目录

结局 C

返回目录

结局 D

返回目录

注:该结局是死循环~

结局 E

返回目录

少侠,接招!

返回目录

jsliang 给你 new 了一个对象:

const obj = {};

obj['A'] = {
  'A': 'Bad End',
  'B': {
    'A': {
      'A': 'Bad End',
      'B': 'End A'
    },
    'B': 'Bad End',
  },
};

obj['B'] = {
  'A': {
    'A': {
      'A': {
        'A': 'End B',
        'B': 'Bad End',
      },
      'B': 'Bad End',
    },
    'B': 'Bad End',
  },
  'B': {
    'A': {
      'A': 'End C',
      'B': {
        'A': obj,
        'B': 'Bad End',
      },
    },
    'B': {
      'A': 'End E',
      'B': 'Bad End',
    },
  },
};

请输出所有成功逃生的通道(Good End):

/**
 * @name 获取所有通关路线图
 * @param {object} obj 路线图
 * @return {array} 返回所有成功的路线图,例如 ['A-B-A-B', ...]
 */
const getGoodEnd = (obj) => {

};

  • 答案

这里要点有 2 点:

  1. 防止递归调用的时候,在某个位置的死循环
  2. 通过回溯解决问题
/**
 * @name 获取所有通关路线图
 * @param {object} obj 路线图
 * @return {array} 返回所有成功的路线图,例如 ['A-B-A-B', ...]
 */
const getGoodEnd = (obj) => {

  // 1. 设置哈希集合
  const set = new Set();

  // 2. 精准判断类型
  const getType = (param) => Object.prototype.toString.call(param).slice(8, -1);

  // 3. 设置返回结果
  const result = [];

  // 4. 递归路线图
  const recursion = (obj, path = []) => {

    // 4.1 遍历当前路线图
    for (let i in obj) {

      // 4.2 如果是自身属性并且没有走过这条路
      if (obj.hasOwnProperty(i) && !set.has(obj[i])) {

        // 4.3 【回溯】先填充路线
        path.push(i);

        // 4.4 判断目标是对象,那就进一步递归
        if (getType(obj[i]) === 'Object') {

          // 4.4.1 设置这条路线走过了
          set.add(obj[i]);

          // 4.4.2 进一步递归它
          recursion(obj[i], path);

        } else if (getType(obj[i] === 'String') && obj[i].includes('End ')) {

          // 4.5 如果走到底了,并且字符串是 End X 的形式,那就是好结局
          result.push(path.join('-'));
        }

        // 4.6 【回溯】推出刚才走过的路线,方便走下一条通道
        path.pop();
      }
    }
  };
  recursion(obj, []);

  // 5. 返回结果
  return result;
};

不折腾的前端,和咸鱼有什么区别!

觉得文章不错的小伙伴欢迎点赞/点 Star。

如果小伙伴需要联系 jsliang

联系方式存放在 Github 首页,坚持每天一道 LeetCode,坚持每天学习,欢迎一起折腾~

知识共享许可协议
jsliang 的文档库梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于github.com/LiangJunron…上的作品创作。
本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by… 处获得。