问题:你得到的字符串J代表的是宝石的类型,S代表你拥有的石头。S中的每个字符都是你拥有的一种石头。你想知道你有多少石头也是珠宝?。
J中的字母是有保证的,J和S中的字符都是字母。字母是区分大小写的,所以“a”与“A”被视为不同的石头类型。
例如:
J:aA S:aaAAbbbb
输出为:3
J:z S:ZZ
输出为:0
注意:
1. J和S为字符串且字符串长度不超过50
2. J中元素不能有重复
方法一:(不是一个好方法,有好多需要改进的地方)
考虑到传统方法,若先把字符串转为数组,然后进行双层遍历。
public class Distinct{
public int numJewelsInStones(String J, String S){
int count=0;
for(String j:J.toCharArray())
for(String s:S.toCharArray())
{ if (j==s)
count++;
}
return count;
}
}
方法二:
本题的实质是J中是否有重复元素且J中元素是不是在S中出现和出现的次数。这时可以用到java中Set接口,它表示无序且不重复的集合。Set接口下有HashSet和TreeSet(红黑树)方法。本题可以用HashSet,当用add()添加元素时,用HashCode和equals方法来比较。先比较哈希值是否相同,如果相同,继续比较equals方法,如果相同不能加入,如果不同可以加入。
public class Distinct{
public int numJewelsInStones(String J, String S){
Set sets=new HashSet();
int count=0;
for(String j:J.toCharArray())
{ sets.add(j);
for(String s:S.toCharArray())
if(sets.contains(s))
count++;
}
return count;
}
}