1、二叉树深度
树的深度为分支的最大深度加根,通过简单递归便能计算出树的深度。具体代码如下:
function maxDepth(root) {
if (!root) {
return 0;
} else {
let left = maxDepth(root.left);
let right = maxDepth(root.right);
return 1 + Math.max(left, right);
}
}
2、平衡二叉树
平衡二叉树为整棵树中左右节点的深度差不超过1的树,此处需计算二叉树及其所有分支的深度,即基于二叉树深度的实现,也是递归即可。具体代码如下:
function isBalanced(root) {
if (!root) {
return true;
}
let left = maxDepth(root.left);
let right = maxDepth(root.right);
return (
Math.abs(left - right) <= 1 &&
isBalanced(root.left) &&
isBalanced(root.right)
);
}
function maxDepth(root) {
if (!root) {
return 0;
} else {
let left = maxDepth(root.left);
let right = maxDepth(root.right);
return 1 + Math.max(left, right);
}
}
3、搜索插入位置
由于数组为有序数组,这种类型的数据结构完全可以通过二分法来寻找,即通过申明双指针,互相靠近,直到左指针大于右指针则退出。具体代码如下:
function searchInsert(nums, target) {
const n = nums.length;
let left = 0,
right = n - 1,
ans = n;
while (left <= right) {
let mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
}
4、罗马数字转整数
罗马数字的逻辑为当左侧的符号代表的数值小于右侧的符号时,对于总体值为负的,且将两个符号合并为一个数值(此处可视为总体减去左侧符号,而且这种情况左侧符号最多只有一个,故而可以直接通过判断左右符号的大小关系来判断当前符号的正负号)。具体代码如下:
function romanToInt(s) {
const symbolValues = new Map();
symbolValues.set("I", 1);
symbolValues.set("V", 5);
symbolValues.set("X", 10);
symbolValues.set("L", 50);
symbolValues.set("C", 100);
symbolValues.set("D", 500);
symbolValues.set("M", 1000);
let ans = 0;
const n = s.length;
for (let i = 0; i < n; ++i) {
const value = symbolValues.get(s[i]);
if (i < n - 1 && value < symbolValues.get(s[i + 1])) {
ans -= value;
} else {
ans += value;
}
}
return ans;
}
5、反转字符串
在不使用额外空间的情况下直接反转传入的字符串,通过js的解构赋值即可。具体代码如下:
function reverseString(s) {
for (let i = 0, j = s.length - 1; i < j; i++, j--) {
[s[i], s[j]] = [s[j], s[i]];
}
return s;
}