算法汇总

112 阅读1分钟

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/th…

字符串

1. 判断字符是否唯一

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 示例 1: 输入: s = "leetcode" 输出: false

示例 2: 输入: s = "abc" 输出: true

var isUnique = function(astr) {
    const set = new Set(astr);
    return [...set].length === astr.length;
};

01.03. URL化

URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)

示例 1: 输入:"Mr John Smith ", 13 输出:"Mr%20John%20Smith"

示例 2: 输入:" ", 5 输出:"%20%20%20%20%20"

var replaceSpaces = function(S, length) {
    const str = S.slice(0, length);
    return str.replaceAll(' ', '%20');
};

罗马数字转整数

罗马数字包含以下七种字符: I, V, X, LCD 和 M。给定一个罗马数字,将其转换成整数。 示例 1: 输入: s = "III" 输出: 3

示例 2: 输入: s = "IV" 输出: 4

示例 3: 输入: s = "IX" 输出: 9

示例 4: 输入: s = "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3.

示例 5: 输入: s = "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.

var romanToInt = function(s) {
    const map = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    }
    const len = s.length;
    let res = 0;
    for(let i = 0; i < n; i++) {
        if(i < n - 1 && map[s[i]] < map[s[i + 1]]) {
            res -= map[s[i]];
        }
        else {
            res += map[s[i]];
        }
    }
    return res;
}

14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs = ["flower","flow","flight"] 输出:"fl"

示例 2: 输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。

var longestCommonPrefix = function(strs) {
    if(!strs.length) {
        return '';
    }
    const getCommonPrefix = function(str1, str2) {
        let len = Math.min(str1.length, str2.length);
        let i = 0;
        while(i < len && str1[i] === str2[i]) {
            i++;
        }
        return str1.slice(0, i);
    }
    let prefix = strs[0]
    for(let i = 1; i < strs.length; i++) {
        prefix = getCommonPrefix(prefix, strs[i]);
        if(!prefix.length) return '';
    }
    return prefix;
}

数组

945. 使数组唯一的最小增量

给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 <= i < nums.length 的下标 i,并将 nums[i] 递增 1。 返回使 nums 中的每个值都变成唯一的所需要的最少操作次数。

示例 1: 输入:nums = [1,2,2] 输出:1 解释:经过一次 move 操作,数组将变为 [1, 2, 3]。

示例 2: 输入:nums = [3,2,1,2,1,7] 输出:6 解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。 可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。

var minIncrementForUnique = function(nums) {
    nums.sort((a, b) => a - b);
    let len = nums.length;
    let res = 0
    for(let i = 1; i < len; i++) {
        if(nums[i] <= nums[i - 1]) {
            let n = nums[i - 1] + 1 - nums[i]
            res += n;
            nums[i] += n;
        }
    }
    return res;
};

面试题 17.16. 按摩师

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

示例 1: 输入: [1,2,3,1] 输出: 4 解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。

示例 2: 输入: [2,7,9,3,1] 输出: 12 解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。

示例 3: 输入: [2,1,4,5,3,1,1,3] 输出: 12 解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。

var massage = function(nums) {
    const len = nums.length;
    if(!len) return 0;
    const dp = [nums[0], Math.max(nums[0], nums[1])];
    for(let i = 2; i < len; i++) {
        dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
    }
    return dp[len -1];
};

矩阵

836. 矩形重叠

矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴,左右边平行于 y 轴。 如果相交的面积为 正 ,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。 给出两个矩形 rec1 和 rec2 。如果它们重叠,返回 true;否则,返回 false 。

示例 1: 输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3] 输出:true

示例 2: 输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1] 输出:false

示例 3: 输入:rec1 = [0,0,1,1], rec2 = [2,2,3,3] 输出:false

var isRectangleOverlap = function(rec1, rec2) {
    if(
        rec2[1] >= rec1[3]
        || rec2[3] <= rec1[1]
        || rec2[0] >= rec1[2]
        || rec2[2] <= rec1[0]
    ) {
        return false;
    }
    return true;
};

数字

69. x 的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1: 输入:x = 4 输出:2 示例 2: 输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

var mySqrt = function(x) {
    if(x === 0) return 0;
    let r = 1;
    while(!( r * r <= x && (r + 1) * (r + 1) > x)) {
        r = parseInt(r - (r * r - x) / (2 * r));
    }
    return r;
};