算法刷题(二十二):宝石与石头

124 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

写在前面

今天的这道题,《宝石与石头》,是关于字符串结构的一道题。

如果你感兴趣,可以一起来看一下具体的题目。

image.png

题目解读

根据题目的标题来看,其实是很难看出来是一个什么样的题目。

但是从题目的描述来看,我们就能很容易的看出这道题到底想要干些什么了。

大概是这样,有两个字符串,分别是jewels、stones两个字符串。

从stones字符串所有字符中,筛选出jewels字符串中的字符数量。

并且保证jewels字符串中不存在重复字符的情况。

如此的话,我们就可以通过遍历两个字符串来解出这道题来。

但是我这第一时间想到的不是这个方法,而是通过替换方法来解决,先通过替换方法将含有的字符删掉,随后再比对替换前后的长度差距。

最终得到正确的结果。

下面就一起来看一下代码的编写吧。

代码实现

本次执行代码如下,大家可以自行参考一下。

public class Solution {

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.numJewelsInStones("aA", "aAAbbbb"));
    }

    public int numJewelsInStones(String jewels, String stones) {
        int result = 0;
        for (int i = 0; i < jewels.length(); i++) {
            int length = stones.length();
            stones = stones.replaceAll(String.valueOf(jewels.charAt(i)), "");
            result = result + length - stones.length();
        }
        return result;
    }

}

代码执行结果

又是这么低的排名,真是……

image.png

其他思路

直接双重循环遍历解决的话,竟然更快,应该就是替换方法导致的效率太慢。

public int numJewelsInStones(String jewels, String stones) {
    int result = 0;
    for (int i = 0; i < jewels.length(); i++) {
        for (int j = 0; j < stones.length(); j++) {
            if(stones.charAt(j) == jewels.charAt(i)){
                result++;
            }
        }
    }
    return result;
}

image.png

总结

本道题,主要考察字符串的熟练掌握程度,一般针对字符串都是遍历字符,比对字符等等的操作,只要掌握这些,解出此题易如反掌。