持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
一、题目描述:
给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
字母区分大小写,因此 "a" 和 "A" 是不同类型的石头。
示例 1:
输入:jewels = "aA", stones = "aAAbbbb"
输出:3
示例 2:
输入:jewels = "z", stones = "ZZ"
输出:0
提示:
- 1 <= jewels.length, stones.length <= 50
- jewels 和 stones 仅由英文字母组成
- jewels 中的所有字符都是 唯一的
二、思路分析:
- 开始使用replace()方法,遍历宝石种类,删除石头中的宝石,最后计算长度,但效率太低
- 将两个字符串都使用toCharArray()方法都变成数组,然后双重循环比对,效率稍微好了一点
- 直接使用双重for循环,直接使用charAt()进行对比,效率同上一个差不多
- 建立在2的基础上进行优化,并多声明一个值,用来存储,在每次对比成功后,将该值移动最后一位,并在下一次不对比,这样的话循环就会少一些,但个人实际在idea里面测试后,发现次数太多的话,还是之前的效率好一点
三、AC 代码:
class Solution {
public int numJewelsInStones(String jewels, String stones) {
int length = 0;
char[] jewelsArray = jewels.toCharArray();
char[] stonesArray = stones.toCharArray();
int b = 0;
for (int i = 0; i < jewelsArray.length; i++) {
for (int j = 0; j < stonesArray.length-b; j++) {
if (jewelsArray[i] == stonesArray[j]){
length++;
stonesArray[j] = stonesArray[stonesArray.length-b-1];
b++;
j -= 1;
}
}
}
return length;
}
}
范文参考:
很好的位运算入门练习,代码配注释 - 宝石与石头 - 力扣(LeetCode)