代码随想录阅读笔记三:哈希表

43 阅读3分钟

242.有效的字母异位词

力扣题目链接

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1: 输入: s = "anagram", t = "nagaram" 输出: true

示例 2: 输入: s = "rat", t = "car" 输出: false

说明:  你可以假设字符串只包含小写字母。

function isAnagram(s: string, t: string): boolean {
    let strArr1: string[] = Array.from(s)
    let strArr2: string[] = Array.from(t)
    strArr1.sort()
    strArr2.sort()
    if(strArr2.join('') == strArr1.join(''))
        return true
    else
        return false
};

笔者个人写法,擅用数组和字符串的内置方法。

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    if(s.length !== t.length) return false;
    const resSet = new Array(26).fill(0);
    const base = "a".charCodeAt();
    for(const i of s) {
        resSet[i.charCodeAt() - base]++;
    }
    for(const i of t) {
        if(!resSet[i.charCodeAt() - base]) return false;
        resSet[i.charCodeAt() - base]--;
    }
    return true;
};

代码随想录原文解法,charCodeAt能获取每个字母字符对应的Unicode值,由于它是连续的,所以可以作为数组索引下标来使用。

349. 两个数组的交集

力扣题目链接

题意:给定两个数组,编写一个函数来计算它们的交集。

349. 两个数组的交集

说明:  输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。

var intersection = function (nums1, nums2) {
    let set1 = new Set(nums1)
    let set2 = Array.from(new Set(nums2))
    let result = []
    
    for (let i = 0; i < set2.length; i++) {
        if (set1.has(set2[i])) {
            result.push(set2[i])
        }
    }
    return result
};
};

笔者方法一 使用Set的特性 去重之后利用Set.has方法来进行交集判断。

    let result = nums1.concat(nums2)
    result = Array.from(new Set(result))
    let final = []
    for (let i = 0; i < result.length; i++) {
        if (nums1.includes(result[i]) && nums2.includes(result[i]))
            final.push(result[i])
    }
    return final

笔者方法二 使用includes判断交集

var arr1=[1,2,3,4,5,6,"a","b"]
var arr2=['a','b',1,2]
var arr3=arr1.filter(item=>{
    return arr2.includes(item)
})
console.log(arr3);//[ 1, 2, 'a', 'b' ]
//filter()数组的过滤方法,会返回满足条件的元素组成一个新数组
//includes()方法如果在数组中查到该元素则返回true否则返回false

利用api取数组交集的最简便办法。

第202题. 快乐数

力扣题目链接

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为  1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

var isHappy = function (n) {
    let set = new Set()
    let sum
    while (sum !== 1) {
        //这一步这样处理是因为一开始sum是undefined
        let arr = ('' + (sum || n)).split('')
        sum = arr.reduce((prev, cur) => {
            return prev + cur ** 2
        }, 0)
        if (set.has(sum)) {
            return false
        }
        set.add(sum)
    }
    return true
};

笔者代码 利用set的特性判断,reduce求和
以下是代码随想录的JavaScript解法

var isHappy = function (n) {
    let m = new Map()

    const getSum = (num) => {
        let sum = 0
        while (n) {
            sum += (n % 10) ** 2
            n = Math.floor(n / 10)
        }
        return sum
    }

    while (true) {
        // n出现过,证明已陷入无限循环
        if (m.has(n)) return false
        if (n === 1) return true
        m.set(n, 1)
        n = getSum(n)
    }
}

// 方法二:使用环形链表的思想 说明出现闭环 退出循环
var isHappy = function(n) {
    if (getN(n) == 1) return true;
    let a = getN(n), b = getN(getN(n));
    // 如果 a === b 
    while (b !== 1 && getN(b) !== 1 && a !== b) {
        a = getN(a);
        b = getN(getN(b));
    }
    return b === 1 || getN(b) === 1 ;
};

// 方法三:使用Set()更简洁
/**
 * @param {number} n
 * @return {boolean}
 */

var getSum = function (n) {
    let sum = 0;
    while (n) {
        sum += (n % 10) ** 2;
        n =  Math.floor(n/10);
    }
    return sum;
}
var isHappy = function(n) {
    let set = new Set();   // Set() 里的数是惟一的
    // 如果在循环中某个值重复出现,说明此时陷入死循环,也就说明这个值不是快乐数
    while (n !== 1 && !set.has(n)) {
        set.add(n);
        n = getSum(n);
    }
    return n === 1;
};

// 方法四:使用Set(),求和用reduce
var isHappy = function(n) {
    let set = new Set();
    let totalCount;
    while(totalCount !== 1) {
        let arr = (''+(totalCount || n)).split('');
        totalCount = arr.reduce((total, num) => {
            return total + num * num
        }, 0)
        if (set.has(totalCount)) {
            return false;
        }
        set.add(totalCount);
    }
    return true;
};