记录每日LeetCode 771.宝石与石头 Java实现

题目描述:

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

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

初始代码:

class Solution {
    public int numJewelsInStones(String jewels, String stones) {

    }
}

示例1:

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

示例2:

输入:jewels = "z", stones = "ZZ"
输出:0

参考答案

// 解法一:暴力解法双重for循环
class Solution {
    public int numJewelsInStones(String jewels, String stones) {   
        // 定义宝石的总和
        int sum = 0;
        // 在对stones遍历时去判断与jewels是否相同
        for(int i = 0; i < stones.length(); ++i) {
            for(int j = 0; j < jewels.length(); ++j) {
                // 如果相同则总和自增并且最内层的for循环跳过(因为已经找到了)
                if(stones.charAt(i) == (jewels.charAt(j))) {
                    sum++;
                    continue;
                }
            }
        }
        return sum;
    }
}
// 解法二:使用Set集合的Api
class Solution {
    public int numJewelsInStones(String jewels, String stones) {
        // 定义总和
        int sum = 0;
        // 将jewels的每个元素都添加到Set集合中
        Set set = new HashSet<>();
        for(int i = 0; i < jewels.length(); ++i) {
            set.add(jewels.charAt(i));
        }
        // 对stones的每个元素进行判断
        // 需要说的是此解法不如暴力解法 因为add()和remove()可能会执行多次
        for(int i = 0; i < stones.length(); ++i) {
            char c = stones.charAt(i);
            if(!set.add(c)) {
                sum++;
            } else {
                set.remove(c);
            }
        }
        return sum;
    }
}
// 解法三:使用数组存储
class Solution {
    public int numJewelsInStones(String jewels, String stones) {
        // 定义总和
        int sum = 0;
        // 因为A-z的ASCII码值为65-122 所以数组大小为123
        int[] arr = new int[123];
        for(int i = 0; i < jewels.length(); ++i){
            arr[jewels.charAt(i)] = 1;
        }
        for(int i = 0; i < stones.length(); ++i){
            sum = sum + arr[stones.charAt(i)];
        }
        return sum;
    }
}

你可能感兴趣的:(java,leetcode,开发语言)