leetcode刷题记录(10)-简单

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;
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值