Leetcode——771.石头与宝石

题目

给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。

思路

利用一个set容器来存放宝石种类,然后遍历S,每次都去set里面寻找有没有这个种类的宝石,有就自增1

代码

import java.util.HashSet;

class Solution {
    public int numJewelsInStones(String J, String S) {
        int count=0;
        HashSet<Character>set=new HashSet<Character>();
        for (int i=0;i<J.length();++i)
        {
            set.add(J.charAt(i));
        }
        for (int i=0;i<S.length();++i)
        {
            if (set.contains(S.charAt(i)))++count;
        }
        return count;
    }
}

结果

这个算法,没有什么杰出的地方,也是一个很烂的算法,就是利用了一个set容器的特性而已
在这里插入图片描述

思路

利用两个for循环,因为一个宝石只能对应一种类型,只要取出每一个宝石,跟里面所有的类型比较一遍,有的话就自增,而且在相同之后,可以直接break,因为一种宝石只有一种类型。

代码

class Solution {
    public int numJewelsInStones(String J, String S) {
        int count=0;
        char c;
        char d;
        //最好这里的S和J的长度要先计算出来,不用每次循环都去计算,利用空间换时间,长度短的循环还好一点,如果长度太长了,这样每次都要计算长度,时间花销会增大很多。
        for (int i=0;i<S.length();++i)
        {
            c=S.charAt(i);
            for (int j=0;j<J.length();++j)
            {
               d=J.charAt(j);
               if (c==d)
               {
                   ++count;
                   break;//一种宝石只有一种类型
               }
            }
        }
        return count;
    }
}

结果

在这里插入图片描述
时间和内存消耗的都比上一个解法少,看来暴力也就不一定那么不好!

大佬思路

看到了利用HashMap来解题,不过c++利用起来很方便,但是Java因为用法更c++不同,甚至还要稍微逊色于第二种解法。就是将每一个字符和一个数值存储在hashmap中,到时候,只要取hashmap中那些对应宝石就可以知道个数了

代码

import java.util.HashMap;

class Solution {
    public int numJewelsInStones(String J, String S) {
        int count=0;
        HashMap<Character,Integer>hashMap=new HashMap<Character, Integer>();
        char c;
        int j;
        for (int i=0;i<S.length();++i)
        {
            c=S.charAt(i);
            if (hashMap.containsKey(c))//如果里面已经有了这个键
            {
                j=hashMap.get(c);//取出来数值
                ++j;//自增1
                hashMap.put(c,j);//再放回去
            }
            else//如果是没有的话,先放进去一个
            {
                j=1;
                hashMap.put(c,j);
            }
        }

        for (int i=0;i<J.length();++i)
        {
            c=J.charAt(i);
            if (hashMap.get(c)!=null)
                count+=(int)hashMap.get(c);
        }
        return count;
    }
}

结果

java的用法没有c++那么方便,所以,c++能达到双百的解法,这边搞不了,甚至还有点慢和占内存!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值