一个半小时的腾讯一面,人麻了

前言

前两天也是抱着玩一玩的心态投了下腾讯,没想到还真给我约到面试了,心里也是忐忑不安起来,但好在腾讯可以无限复活,无所谓了大不了就挂呗,就当去学习一下了, 上来就是三道算法题,都不让你先自我介绍,写不出来直接别面了😂下面一起来看下腾讯的算法面试题吧。

第一道算法题

笔者找了好久都没找到这道题的原题是什么,上来就是一个文字没有,让实现一个HardMan函数。

刚看到这道题确实是没什么头绪的,于是乎我先去看后面的两道题了,后面才想起来应该要用promise来进行回调什么的,下面是我当时写的代码,写的一坨屎,还不能运行,现场又不会debug😭

面试官看我思路没什么问题就一直在引导我,但是当时人直接懵了😭什么都想不起来什么都不会。来看下正确的答案吧,我写的代码因为promise没有返回,所以就执行不到learn方法,这段代码加个async就很好的可以解决了。

javascript 复制代码
function HardMan(name) {
    console.log(`I am ${name}`);
    return {
        rest: function (seconds) {
            return new Promise((resolve) => {
                setTimeout(() => {
                    console.log(`// 等待 ${seconds} 秒`);
                    resolve();
                }, seconds * 1000);
            });
        },
        learn: async function (subject) {
            await this.rest(5); // 默认等待5秒
            console.log(`Start learning after 5 seconds`);
            console.log(`Learning ${subject}`);
        }
    };
}

打家劫舍II

力扣上213原题,之前跟着代码随想录刷过,脑子里不仅有思路还有完整的代码,心想总算能给我装一下了😂

js 复制代码
var rob = function(nums) {
  const n = nums.length 
  if (n === 0) return 0 // 没有房子
  if (n === 1) return nums[0]
  // 两种情况
  const result1 = robRange(nums, 0, n - 2)
  const result2 = robRange(nums, 1, n - 1)
  return Math.max(result1, result2)
};

const robRange = (nums, start, end) => {
  if (end === start) return nums[start]
  const dp = Array(nums.length).fill(0)
  // 初始化dp数组
  dp[start] = nums[start]
  dp[start + 1] = Math.max(nums[start], nums[start + 1]) // 状态转移方程
  for (let i = start + 2; i <= end; i++) {
    dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1])
  }
  return dp[end]
}

由于笔者对这道题目印象还算深刻,写的时候也是假装在认真思考,然后写点注释,笑死了,面试官还说我思路非常清晰,殊不知我压根就是背出来的,纯属装X😎

打家劫舍III

力扣上337原题,在代码随想录中也有看到过,但是当时觉得有点难就没管,最后这道题也就没写出来😭,这道题跟打家劫舍II如出一辙,不过这个换成树了。

ini 复制代码
const rob = root => {
    // 后序遍历函数
    const postOrder = node => {
        // 递归出口
        if (!node) return [0, 0];
        // 遍历左子树
        const left = postOrder(node.left);
        // 遍历右子树
        const right = postOrder(node.right);
        // 不偷当前节点,左右子节点都可以偷或不偷,取最大值
        const DoNot = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        // 偷当前节点,左右子节点只能不偷
        const Do = node.val + left[0] + right[0];
        // [不偷,偷]
        return [DoNot, Do];
    };
    const res = postOrder(root);
    // 返回最大值
    return Math.max(...res);
};

现场因为太紧张了又没刷这道题导致没写出来,但还是依照第二题有模有样的跟面试官说了下思路,现在来看,这道题还是要看对二叉树的后序遍历熟不熟悉,还是得老老实实刷代码随想录😭

相关推荐
剪刀石头布啊6 分钟前
浏览器进程与事件循环
前端·浏览器
剪刀石头布啊7 分钟前
浏览器渲染原理
前端·浏览器
uhakadotcom17 分钟前
快速构建交互式数据应用:Streamlit入门指南
后端·面试·github
日记成书33 分钟前
【HTML 基础教程】HTML 表格
前端·html
木木黄木木37 分钟前
HTML5贪吃蛇游戏开发经验分享
前端·html·html5
无名之逆43 分钟前
hyperlane:Rust HTTP 服务器开发的不二之选
服务器·开发语言·前端·后端·安全·http·rust
李鸿耀1 小时前
前端包管理工具演进史:从 npm 到 pnpm 的技术革新
前端·面试
麓殇⊙1 小时前
前端基础知识汇总
前端
MariaH1 小时前
邂逅jQuery库
前端
Jenlybein1 小时前
学完 Vue3 记不牢?快来看这篇精炼Vue3笔记复习一下 [ Route 篇 ]
前端·vue.js