每日一题 -- LeetCode771

113 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情image.png

前言

每日一题,轻松解题

每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。

正文

:宝石与石头

难度:简单

题目要求:

 给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

字母区分大小写,因此 "a" 和 "A" 是不同类型的石头。

举个例子

输入: jewels = "aA", stones = "aAAbbbb"
输出: 3

:解题

方法一 :暴力

解题思路:

暴力法的思路很直观,遍历字符串 \textit{stones}stones,对于 \textit{stones}stones 中的每个字符,遍历一次字符串 \textit{jewels}jewels,如果其和 \textit{jewels}jewels 中的某一个字符相同,则是宝石。

编辑代码:

var numJewelsInStones = function(jewels, stones) {
    jewels = jewels.split('');
    return stones.split('').reduce((prev, val) => {
        for (const ch of jewels) {
            if (ch === val) {
                return prev + 1;
            }
        }
        return prev;
    }, 0);
};

方法二 :哈希集合

哈希集合

哈希表是一种通过关键码去寻找值的映射的数据结构

哈希表就需要通过哈希函数将特定的键映射到特定值的数据结构,维护了键和值之间的对应关系 键:称之为关键字,唯一的表示要存储的数据,也可以是数据本身或者是数据的一部分 哈希函数:将键映射到数据对应存放的位置的函数 哈希冲突:哈希函数将两个不同或者更多的不同的键映射到同一个索引位置

哈希表结构解决两个问题:合理的构建哈希函数,如何解决哈希冲突

解题思路:

方法一中,对于字符串 stones 中的每个字符,都需要遍历一次字符串jewels,导致时间复杂度较高。如果使用哈希集合存储字符串 jewels 中的宝石,则可以降低判断的时间复杂度。

遍历字符串 jewels,使用哈希集合存储其中的字符,然后遍历字符串 stones,对于其中的每个字符,如果其在哈希集合中,则是宝石。

编辑代码:

var numJewelsInStones = function(jewels, stones) {
    const jewelsSet = new Set(jewels.split(''));
    return stones.split('').reduce((prev, val) => {
        return prev + jewelsSet.has(val);
    }, 0);
};

总结

无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。