LeetCode-24

Leetcode-24

只能说随心一点刷题了好吧。

1108 IP 地址无效化

时间:2022-06-21

var defangIPaddr = function (address) {
    return address.replace(/\./g, '[.]');
};

508 出现次数最多的子树元素和

时间:2022-06-21

就这?

var findFrequentTreeSum = function (root) {
    const map = new Map();
    const dfs = (root) => {
        if (!root) return 0;
        const left = dfs(root.left);
        const right = dfs(root.right);
        const sum = left + right + root.val;
        map.set(sum, (map.get(sum) || 0) + 1);
        return sum;
    };
    dfs(root)
    let max = 0;
    for (let m of map.values()) max = Math.max(m, max);
    const res = [];
    for (let m of map) if (m[1] === max) res.push(m[0]);
    return res;
};

1089 复写零

时间:2022-06-21

一遍遍历过,先统计这个总长度就行了,

var duplicateZeros = function (arr) {
    const len = arr.length;
    let tmp = 0,
        i = 0;
    for (; i < len; i++) {
        if (arr[i] === 0) tmp++;
        tmp++;
        if (tmp >= len) break;
    }
    if (i == len) return arr;
    let j = len - 1;
    if (tmp > len) {
        arr[j] = 0;
        i--;
        j--;
    }
    while (j >= 0) {
        if (arr[i] == 0) arr[j--] = 0;
        arr[j--] = arr[i--];
    }
    return arr;
};

532 数组中的 k-diff 数对

时间:2022-06-21

写的复杂了点,但是不碍事,还行我只能说。

var findPairs = function (nums, k) {
    let res = 0;
    if (k == 0) {
        nums.sort((a, b) => a - b);
        let flag = true;
        for (let i = 0; i < nums.length - 1; i++) {
            if (nums[i] == nums[i + 1]) {
                if (flag) {
                    res++;
                    flag = false;
                }
                continue;
            }
            flag = true;
        }
        return res;
    }
    const set = new Set(nums);
    const arr = Array.from(set).sort((a, b) => a - b);
    for (let i of arr) {
        if (set.has(i + k)) res++;
    }
    return res;
};

面试 1712 BiNode

时间:2022-06-22

需要注意,把左指针变没这个操作是在root这层级,因为已经遍历完了root.left了,左子树全部遍历完了,所以在这里root.left变成null是合适的。

var convertBiNode = function (root) {
    let prev = null;
    let head = null;
    const dfs = (root) => {
        if (!root) return;
        dfs(root.left);
        if (prev === null) {
            prev = root;
            head = root;
        } else {
            prev.right = root;
            prev = root;
        }
        root.left = null;
        dfs(root.right);
    };
    dfs(root);
    return head;
};

522 最长特殊序列 II

时间:2022-06-30

抄的,题目没看懂,大家都说题目有问题,那我就放心了。总结一句话就是找到数组中的某个字符串不是其他字符串的子序列,返回最长的长度就行了。

var findLUSlength = function (strs) {
    let res = -1;
    out:
    for (let [i, s] of strs.entries()) {
        if (s.length > res) {
            for (let [j, s_] of strs.entries()) {
                if (j != i && isSubStr(s, s_)) {
                    continue out;
                }
            }
            res = s.length;
        }
    }
    return res;
};
function isSubStr(s1, s2) {
    const m = s1.length,
        n = s2.length;
    if (m > n) return false;
    let i = 0;
    for (let j = 0; (i < m) & (j < n); j++) {
        if (s1[i] == s2[j]) i++;
    }
    return i == m;
}

324 摆动排序 II

时间:2022-06-30

抄的,没做出来,这个奇偶性有点恶心。要倒序插入,这谁能够猜到,还有还几种优化方法,太难了这道题。

var wiggleSort = function(nums) {
    const arr = nums.slice();
    arr.sort((a, b) => a - b);
    const n = nums.length;
    const x = Math.floor((n + 1) / 2);
    for (let i = 0, j = x - 1, k = n - 1; i < n; i += 2, j--, k--) {
        nums[i] = arr[j];
        if (i + 1 < n) {
            nums[i + 1] = arr[k];
        }
    }
};

535 TinyURL 的加密与解密

时间:2022-06-30

抄的,就这?我以为有多难呢

var encode = function(longUrl) {
    this.dataBase = new Map();
    let key;
    while (true) {
        key = Math.floor(Math.random() * (Number.MAX_SAFE_INTEGER));
        if (!dataBase.has(key)) {
            break;
        }
    }
    this.dataBase.set(key, longUrl);
    return "http://tinyurl.com/" + key;
};

var decode = function(shortUrl) {
    const p = shortUrl.lastIndexOf('/') + 1;
    const key = parseInt(shortUrl.substring(p));
    return this.dataBase.get(key);
};

1175 质数排列

时间:2022-06-30

抄的,连抄四题,真有我的,先求出质数的个数,再算出质数的排列数和合数的排列数,两个再相乘。

const MOD = 1000000007;
var numPrimeArrangements = function (n) {
    let numPrimes = 0;
    // 先找出1-n的所有质数
    for (let i = 2; i <= n; i++) if (isPrime(i)) numPrimes++;
    // 然后组合,总的方案数即为「所有质数都放在质数索引上的方案数」×「所有合数都放在合数索引上的方案数」
    let res = 1;
    let m = n - numPrimes;
    while (numPrimes > 0) {
        res = res % MOD;
        res *= numPrimes;
        numPrimes--;
    }
    while (m > 0) {
        res = res % MOD;
        res *= m;
        m--;
    }
    return res;
};

const isPrime = (n) => {
    if (n === 1) return false;
    for (let i = 2; i * i <= n; i++) if (n % i === 0) return false;
    return true;
};

241 为运算表达式设计优先级

时间:2022-07-01

抄的,经典的分治思想?反正我做不太出来,看起来比较简单,也确实还行吧,我只能说。主要有两点,一个是分开left和right,然后根据char,来处理left和right。还有一个就是只有一个值的返回值就是直接存。

这里还学到一个新的知识点,就是switch是比if快很多,如果为了性能,能用switch就用switch,比if快的很多。

const map = new Map(); // 表达式 -> 结果集
var diffWaysToCompute = function (expression) {
    if (map.has(expression)) return map.get(expression); // 直接返回
    const res = []; // 每个表达式对应的 结果集
    for (let i = 0; i < expression.length; i++) {
        const char = expression[i];
        if (char === '-' || char === '+' || char === '*') {
            // 分割 分而治之
            const lefts = diffWaysToCompute(expression.slice(0, i)); // slice包前不包后 返回0~i-1表达式的结果集
            const rights = diffWaysToCompute(expression.slice(i + 1)); // 返回i+1~最后表达式的结果集
            for (const left of lefts)
                for (const right of rights) {
                    switch (char) {
                        case '+':
                            res.push(left + right);
                            break;
                        case '-':
                            res.push(left - right);
                            break;
                        case '*':
                            res.push(left * right);
                            break;
                        default:
                            break;
                    }
                }
        }
    }
    if (!res.length) res.push(parseInt(expression)); // 直接存
    map.set(expression, res);
    return res;
};

31 下一个排列

时间:2022-07-04

为了下一道题做准备,这道题还是蛮难的,虽然解析看起来很简单,但其实还是比较难的,直接抄的,需要三步走。图形化想一想就行了,先找到从后往前的小高峰的左边数字,然后找到小高峰右边数字比左边大的,再交换,然后把右边降序的坡改成升序的坡。反正我是绝对想不到这种方法的。

var nextPermutation = function (nums) {
    //从后往前遍历找到相邻升序的数字
    let i = nums.length - 2;
    while (i >= 0 && nums[i] >= nums[i + 1]) i--;
    //从i到末尾找到比i大的数字交换
    let j = nums.length - 1;
    if (i >= 0) {
        while (nums[j] <= nums[i]) j--;
        [nums[i], nums[j]] = [nums[j], nums[i]];
    }
    i++;
    j = nums.length - 1;
    // 然后reserve,i+1到末尾
    while (i < j) {
        [nums[i], nums[j]] = [nums[j], nums[i]];
        i++;
        j--;
    }
    return nums;
};

556 下一个更大元素 III

时间:2022-07-04

就是上面那道题目,不过就是那道题的解法,就是需要把数字变成数组

var nextGreaterElement = function (n) {
    const nums = [];
    while (n >= 1) {
        nums.push(n % 10);
        n = Math.floor(n / 10);
    }
    nums.reverse();
    //从后往前遍历找到相邻升序的数字
    let i = nums.length - 2;
    while (i >= 0 && nums[i] >= nums[i + 1]) i--;
    //从i到末尾找到比i大的数字交换
    let j = nums.length - 1;
    if (i >= 0) {
        while (nums[j] <= nums[i]) j--;
        [nums[i], nums[j]] = [nums[j], nums[i]];
    } else return -1;
    i++;
    j = nums.length - 1;
    // 然后reserve,i+1到末尾
    while (i < j) {
        [nums[i], nums[j]] = [nums[j], nums[i]];
        i++;
        j--;
    }
    const res =Number.parseInt(nums.join(''));
    if(res>2147483647) return -1;
    return res;
};

1200 最小绝对差

时间:2022-07-04

就这?简单题确实重拳出击了朋友

var minimumAbsDifference = function (arr) {
    arr.sort((a, b) => a - b);
    let min = Infinity;
    for (let i = 0; i < arr.length - 1; i++) {
        const tmp = arr[i + 1] - arr[i];
        if (tmp < min) min = tmp;
    }
    const res = [];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i + 1] - arr[i] === min) res.push([arr[i], arr[i + 1]]);
    }
    return res;
};
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇