跳至主要內容

codetop 中等难度刷题

Yihui大约 2 分钟

codetop 中等难度刷题

https://codetop.cc/home

剑指 Offer 48. 最长不含重复字符的子字符串open in new window

方法一:滑动窗口

var lengthOfLongestSubstring = function(s) {
    // 哈希集合,记录每个字符是否出现过
    const occ = new Set();
    const n = s.length;
    // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
    let rk = -1, ans = 0;
    for (let i = 0; i < n; ++i) {
        if (i != 0) {
            // 左指针向右移动一格,移除一个字符
            occ.delete(s.charAt(i - 1));
        }
        while (rk + 1 < n && !occ.has(s.charAt(rk + 1))) {
            // 不断地移动右指针
            occ.add(s.charAt(rk + 1));
            ++rk;
        }
        // 第 i 到 rk 个字符是一个极长的无重复字符子串
        ans = Math.max(ans, rk - i + 1);
    }
    return ans;
};

方法三:双指针 + 哈希表

var lengthOfLongestSubstring = function (s) {
    const map = new Map();
    let i = -1, res = 0;
    for (let j = 0; j < s.length; j++) {
        if (map.has(s[j])) {
            i = Math.max(i, map.get(s[j]));
        }
        map.set(s[j], j);
        res = Math.max(res, j - i);
    }
    return res;
};

179. 最大数open in new window

交互比较组合

/**
 * @param {number[]} nums
 * @return {string}
 */
var largestNumber = function (nums) {
    if (nums.length === 1) return nums[0].toString();
    for (let j = 0; j < nums.length; j++) {
        for (let i = 0; i < nums.length - 1; i++) {
            if (parseInt('' + nums[i] + nums[i + 1]) <
                parseInt('' + nums[i + 1] + nums[i])) {
                [nums[i], nums[i + 1]] = [nums[i + 1], nums[i]]
            }
        }
    }
    if(nums[0]===0)return "0";
    return nums.reduce((pre, cur) => {
        return pre + cur;
    }, '')
};

简洁版本

var largestNumber = function(nums) {
    nums.sort((a,b) => {
        var stra = b.toString() + a.toString(), strb = a.toString() + b.toString();
        if (stra > strb) { // 不需要转换为int
            return 1
        } else {
            return -1
        }
    });
    if (nums[0] == 0) return '0'
    return nums.join('');
};

1143. 最长公共子序列open in new window

动态规划

image.png
var longestCommonSubsequence = function(text1, text2) {
    const m = text1.length, n = text2.length;
    const dp = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
    for (let i = 1; i <= m; i++) {
        const c1 = text1[i - 1];
        for (let j = 1; j <= n; j++) {
            const c2 = text2[j - 1];
            if (c1 === c2) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            } else {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }
    return dp[m][n];
};

151. 颠倒字符串中的单词open in new window

利用正则匹配!!!

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    return s.trim().split(/\s+/).reverse().join(' ');
};