1.数组中的K-diff数对
题目:
给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k.
思路:用map记录每个数字出现的次数,如果K是0,那么记录出现次数大于等于2次的。如果不等于0,那么记录i及i+K大于等于1的次数
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findPairs = function(nums, k) {
if (k < 0) return 0;
const map = new Map();
for (const i of nums) {
map.set(i, (map.get(i) || 0) + 1);
}
if (k == 0) {
return [...map.values()].filter((i) => i >= 2).length;
}
let res = 0;
for (const i of map.keys()) {
if (map.get(i) >= 1 && map.get(i + k) >= 1) {
res++;
}
}
return res;
};
2.将二叉搜索树转换为累加树
题目:
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
思路:二叉搜索树,中序遍历是升序,所以中序遍历且记录之前的数之和。记得区分一下等于的数即可
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var convertBST = function(root) {
if (!root) return root;
let current;
let sum = 0;
let currentVal = 0;
const search = (root) => {
if (root.right) {
search(root.right);
}
if (root.val !== current) {
sum = currentVal;
current = root.val;
root.val += sum;
sum = currentVal = root.val;
} else {
root.val += sum;
currentVal += root.val;
}
if (root.left) {
search(root.left);
}
};
search(root);
return root;
};
3.反转字符串 II
题目:
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
思路:以2k长度为单位遍历,每个单位的前k个字符反转,然后拼接
/**
* @param {string} s
* @param {number} k
* @return {string}
*/
var reverseStr = function(s, k) {
const l = s.length;
let res = "";
let i = 0;
while (i < l) {
const sk = s.slice(i + k, i + 2*k);
const sk1 = s.slice(i, i+k);
let a = "";
for (const i of sk1) {
a = `${i}${a}`;
}
res += `${a}${sk}`;
i += 2 * k;
}
return res;
};
4.二叉树的直径
题目:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点
思路:动态规划。二叉树的直径,就是这棵树的左高度+右高度,与左子树的高度。以及右子树的高度的最大值。所以封装一个求二叉树高度的函数,然后用递归实现。
/**
* @param {TreeNode} root
* @return {number}
*/
var diameterOfBinaryTree = function (root) {
if (!root) return 0;
const left= diameterOfBinaryTreeAA(root.left)
const right=diameterOfBinaryTreeAA(root.right)
return Math.max(left+right,diameterOfBinaryTree(root.left),diameterOfBinaryTree(root.right))
};
var diameterOfBinaryTreeAA = function (root) {
if(!root)return 0
return (
Math.max(diameterOfBinaryTreeAA(root.left) , diameterOfBinaryTreeAA(root.right) ) + 1
);
};
5.学生出勤记录 I
题目:
给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符:
'A' : Absent,缺勤
'L' : Late,迟到
'P' : Present,到场
如果一个学生的出勤记录中不超过一个'A'(缺勤)并且不超过两个连续的'L'(迟到),那么这个学生会被奖赏。
你需要根据这个学生的出勤记录判断他是否会被奖赏。
思路:遍历字符串,如果遇到两个A,则返回false;如果遇到连续三个L,返回false。否则情况返回true
* @param {string} s
* @return {boolean}
*/
var checkRecord = function(s) {
const l = s.length;
let flag = false;
for (let i = 0; i < l; i++) {
if (s[i] === "A") {
if (flag) return false;
flag = true;
}
if (s[i] === "L" && s[i + 1] === "L"&&s[i + 2] === "L") return false;
}
return true;
};