字节前端笔试8.28
题型:单选10 多选5 编程2
单选多选
常规题型吧~不多说了,偏简单
编程第一题 (100%)
思路:
注意:检验合法性既要检验数也要检验松果数
- 松果数不符合条件,即[1,100]直接返回 [flase, 0]
- 二叉树不符合条件
(1)没有节点,返回[false, 松果数]
(2)有节点,返回[false,剩余松果数] - 二叉树符合条件,返回[true, 剩余松果数]
// 二叉树构造函数
function TreeNode(val, left, right) {
this.val = val ? val : undefined;
this.left = left ? left : null;
this.right = right ? right : null;
}
function fn(nodes, nums) {
let root = [...nodes];
// 边界条件
if (nums <= 0 || nums > 100) return [false,0];
if (!nodes) return [false, nums];
let res = [];
// 构建二叉树并且检验是否合法
let flag = constructTree(root);
res.push(flag);
// 计算剩余松果数
let temp = nodes.filter(item => item !== -1);
let sum = temp.length*5 - temp.reduce((p, v) => p+v);
if (sum >= nums) {
res.push(0);
} else {
res.push(nums-sum);
}
return res.join(' ')
}
// 判断是否能构建二叉树
function constructTree(nodes) {
if (!nodes.length) return null;
let root = new TreeNode(nodes.shift());
let queue = [root]; // 队列存储
while (nodes.length) {
let node = queue.shift(); // 获取节点
if (node.val === -1 && nodes.shift() !== -1) {
return false;
}
let left = new TreeNode(nodes.shift());
node.left = left;
queue.push(left);
let right = new TreeNode(nodes.shift());
node.right = right;
queue.push(right);
}
return true;
}
编程第二题 (60%) 想到了优化思路但当时没写出来~
关键思路:0在破坏乘积递增的趋势
原思路:
dp获取最大乘积所在index(第一个),根据dp前面的乘积结果逆推start边界(即乘积为0的前一个)
通过了60%,应该是超时了...
优化思路:
(1)解题关键就是0,所以可以把原数组根据0切割成多个子数组,得到最大子数组的乘积,返回相应的索引+1即可
(2)进阶:一次遍历,维护start,end,maxValue,根据nums[end]是否为0且maxValue的值考虑更新end和start的情况
想到了优化思路但当时没写出来!私下补吸取教训
原思路
function fn(n, nums) {
if (nums.length === 1) return [1,1];
let dp = [nums[0]*nums[0]];
for (let i = 1; i < n; i++) {
dp.push(Math.max(dp[dp.length -1]*nums[i], nums[i]));
}
let maxValue = Math.max(...dp); // 得到最大数字
let index = dp.indexOf(maxValue);
let start = index;
while (start >= 0 ) {
//console.log(start, nums[start]);
if (nums[start] !== 0) {
start--;
console.log(start);
} else {
break;
}
}
return [start+2, index+1];
} 优化思路(待补充...)
#字节跳动笔试##前端#有更好的思路欢迎留言!

