算法合集 | 哈希表 | Leetcode 383 205 169

75 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

前言

本系列文章主要会总结一些常见的算法题目以及算法的易错点,难点,以及一些万用的公式,并且结合实际的 Leetcode 题目来进行加深理解以及实际应用,算法这种东西,属于是一到用时方恨少的类型,在平时总结一些常见的简单算法,经常磨练自己的算法思维,对于日常的开发还是能有不少的帮助的。

Leetcode 383. 赎金信

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

解题

这道题和 242.有效的字母异位词 很像,字母异位是求两个字符是否可以互相组成,而这道题是 字符串 ransomNote 能不能由 magazine 构成,而不在乎 magazine 能不能由 ransomNote 构成。

通过一个map表去把 ransomNote 的元素个数都保存下来,再去遍历 magazine 抵消掉对应的元素,最后看看map表中的每一个元素是否都小于等于0.

function canConstruct(ransomNote: string, magazine: string): boolean {
   let arrnumber[] = new Array(26).fill(0);
    let basenumber = 'a'.charCodeAt(0);
    let indexnumber;
    for (let i = 0, length = ransomNote.length; i < length; i++) {
        arr[ransomNote[i].charCodeAt(0) - base]++;
    }
    for (let i = 0, length = magazine.length; i < length; i++) {
        index = magazine[i].charCodeAt(0) - base;
        arr[index]--;
    }
    return arr.every(i => i <= 0)
}

image.png

Leetcode 205. 同构字符串

给定两个字符串 s 和 t ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

解题

还是跟上面一样的思路,通过map表来保存下一个字符的每一个位置对应的值,然后通过另一个字符串的首个字符的相差值来判断接下去的字符,按照题目的意思,每一个对应的位置上的偏差值都应该相等。

var isIsomorphic = function (s: String, t: String) {
    let map = new Map()
    for (let i = 0; i < s.length; i++) {
        const a = s[i], b = t[i]
        if (map.has(a) ? map.get(a) !== b : Array.from(map.values()).includes(b)) {
            return false
        }
        map.set(a, b)
    }
    return true
};

图片.png

Leetcode 169. 多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

解题

我们使用哈希表来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。

我们用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。并且在这个过程当中,通过打擂台的方式保存下出现次数最多的元素,以及具体的出现次数方便下次判断。

function majorityElement(nums: number[]): number {
    let map = new Map();
    let count = 0;
    let res = 0;
    for (let i = 0; i < nums.length; i++) {
        map.set(nums[i], map.get(nums[i])+1 || 1)
        if(map.get(nums[i]) >= count){
            count = map.get(nums[i])
            res = nums[i]
        }
    }
    return res;
};

图片.png