【哈希表上】哈希表

文章介绍了几个使用JavaScript实现的算法问题,包括检查两个字符串是否为字母异位词、计算两个数组的交集以及使用哈希表解决快乐数和两数之和的问题。这些解决方案利用了Map和Set数据结构以及哈希映射的特性。
摘要由CSDN通过智能技术生成

242. 有效的字母异位词

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    let ms = new Map();
    let mt = new Map();
    for(let i=0;i<s.length;i++) {
        if(ms.has(s[i])) {
            let k=ms.get(s[i]);
            ms.set(s[i],k+1);
        }
        else {
            ms.set(s[i],1);
        }
    }
    for(let i=0;i<t.length;i++) {
        if(mt.has(t[i])) {
            let k=mt.get(t[i]);
            mt.set(t[i],k+1);
        }
        else {
            mt.set(t[i],1);
        }
    }
    if(ms.size!==mt.size) return false;
    for(let e of ms) {
        if(!mt.has(e[0]) || mt.get(e[0])!==e[1]) {
            return false;
        }
    }
    return true;
};

第二种方法

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    let a = new Array(27);
    for(let i=0;i<a.length;i++) {
        a[i]=0;
    }
    let base = 'a'.charCodeAt();
    for(let str of s) {
        a[str.charCodeAt()-base]++;
    }
    for(let str of t) {
        a[str.charCodeAt()-base]--;
    }
    return a.every((item)=>{return item==0})
};

我才知道js中的字符串-字符串不是数值,之前在c++里可以用’a’-'a’得到相对位置。在js里不行,必须用方法。charCodeAt()

349. 两个数组的交集

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    let s1= new Set(nums1);
    let s2= new Set(nums2);
    let result = new Array();
    for(item of s1) {
        if(s2.has(item)) {
            result.push(item);
        }
    }
    return result;
};

350. 两个数组的交集 II

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {
    let newn2=nums2;
    let result = new Array();
    for(let item of nums1) {
        if(newn2.includes(item)) {
            result.push(item);
            for(let i=0;i<newn2.length;i++) {
                if(newn2[i]===item) {
                    newn2[i]=-1;
                    break;
                }
            }
        }
    }
    return result;
};

202. 快乐数

思路

这道题目看上去貌似一道数学问题,其实并不是!

题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!

正如:关于哈希表,你该了解这些! (opens new window)中所说,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。

所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

还有一个难点就是求和的过程,如果对取数值各个位上的单数操作不熟悉的话,做这道题也会比较艰难。

/**
 * @param {number} n
 * @return {boolean}
 */
var isHappy = function(n) {
    let s = new Set();
    let m=String(n);
    while(m!=='1') {
        let sum=0;
        for(let i of m) {
            sum+=Number(i)*Number(i);
        }
        if(s.has(sum)) return false;
        s.add(sum);
        m=String(sum);
    }
    return true;
};

1. 两数之和

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let map = new Map();
    for(let i=0;i<nums.length;i++) {
        if(!map.has(target-nums[i])) {
            map.set(nums[i],i);
        }
        else return [i,map.get(target-nums[i])];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值