算法| ss 字符串数组对象

发布于:2024-04-06 ⋅ 阅读:(126) ⋅ 点赞:(0)
    1. 罗马数字转整数
  • 409.最长回文串
    1. 字符串相加
  • 594.最长和谐子序列

13. 罗马数字转整数

/**
 * @param {string} s
 * @return {number}
 */
// 构建map匹配值,增加带IV这种的
// for遍历循环,
// 1.先看匹配是否满足2个字符的 i+2
// 2. 单个字符匹配
var romanToInt = function (s) {
  const map = {
    I: 1,
    IV: 4,
    V: 5,
    IX: 9,
    X: 10,
    XL: 40,
    L: 50,
    XC: 90,
    C: 100,
    CD: 400,
    D: 500,
    CM: 900,
    M: 1000,
  };
  let ans = 0;
  for (let i = 0; i < s.length; i++) {
    const substr = s.substring(i, i + 2);
    if (i + 1 < s.length && map[substr]) {
      ans += map[substr];
      i += 1;
    } else {
      ans += map[s[i]];
    }
  }
  //   console.log(ans);
  return ans;
};
// romanToInt("III");
// romanToInt("IV");
romanToInt("MCMXCIV");
// 示例 1:
// 输入: s = "III"
// 输出: 3
// 示例 2:
// 输入: s = "IV"
// 输出: 4

409.最长回文串

/**
 * @param {string} s
 * @return {number}
 */
// 思路
// 统计各个字符出现的次数
// 统计奇数个数, 只留一个奇数个数,其他个数删除1
// 如果奇数个数大于1
// 总长度= 字符串长度- (奇数个数-1)
//
var longestPalindrome = function (s) {
  const map = {};
  for (let ch of s) {
    map[ch] = (map[ch] ?? 0) + 1;
  }
  let deleteCount = 0;
  for (let key in map) {
    if (map[key] % 2 !== 0) {
      deleteCount += 1;
    }
  }
  const ans = deleteCount > 1 ? s.length - (deleteCount - 1) : s.length;
  //   console.log(ans);
  return ans;
};
longestPalindrome("abccccdd");

// 输入:s = "abccccdd"
// 输出:7

415. 字符串相加

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
// 思路
// 从两个数的末尾进行取值 相加
// while循环很重要, i>=0 j>=0  carry>=0
// 往数组里添加 求余值放入数组  进位值进入下一轮计算
var addStrings = function (num1, num2) {
  let i = num1.length - 1;
  let j = num2.length - 1;
  let carry = 0;
  const res = [];
  while (i >= 0 || j >= 0 || carry !== 0) {
    let c1 = i >= 0 ? num1.charAt(i) - "0" : 0;
    let c2 = j >= 0 ? num2.charAt(j) - "0" : 0;
    // console.log("c1", c1);
    // console.log("c2", c2);
    const sum = c1 + c2 + carry;
    res.push(sum % 10);
    carry = Math.floor(sum / 10);
    i--;
    j--;
  }
  //   console.log(res);
  return res.reverse().join("");
};
addStrings("11", "123");
// 输入:num1 = "11", num2 = "123"
// 输出:"134"

594.最长和谐子序列

/**
 * @param {number[]} nums
 * @return {number}
 */
// 思路
// 统计各个数出现的次数
// 利用map 来获取最大值
// map是有序的, 不想对象是无序的
var findLHS = function (nums) {
  const map = new Map();
  for (let ch of nums) {
    map.set(ch, (map.get(ch) ?? 0) + 1);
  }
  console.log(map);
  let max = 0;
  for (let key of map.keys()) {
    if (map.get(key + 1)) {
      max = Math.max(max, map.get(key) + map.get(key + 1));
    }
  }
  console.log(max);
  return max;
};
findLHS([1, 3, 2, 2, 5, 2, 3, 7]);
// 输入:nums = [1,3,2,2,5,2,3,7]
// 输出:5


网站公告

今日签到

点亮在社区的每一天
去签到