前言
前两天也是抱着玩一玩的心态投了下腾讯,没想到还真给我约到面试了,心里也是忐忑不安起来,但好在腾讯可以无限复活,无所谓了大不了就挂呗,就当去学习一下了, 上来就是三道算法题,都不让你先自我介绍,写不出来直接别面了😂下面一起来看下腾讯的算法面试题吧。
第一道算法题
笔者找了好久都没找到这道题的原题是什么,上来就是一个文字没有,让实现一个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);
};
现场因为太紧张了又没刷这道题导致没写出来,但还是依照第二题有模有样的跟面试官说了下思路,现在来看,这道题还是要看对二叉树的后序遍历熟不熟悉,还是得老老实实刷代码随想录😭