原题目:
You're given strings J
representing the types of stones that are jewels, and S
representing the stones you have. Each character in S
is a type of stone you have. You want to know how many of the stones you have are also jewels.
The letters in J
are guaranteed distinct, and all characters in J
and S
are letters. Letters are case sensitive, so "a"
is considered a different type of stone from "A"
.
翻译:
你有一个J
代表珠宝和石头类型的字符串,并且S
代表你拥有的宝石。每个S的元素
都是你拥有的一种石头。你想知道你有多少宝石。
在这些信件J
是保证不同,而在所有的字符J
和S
是字母。字母区分大小写,因此"a"
被认为是不同类型的石头"A"
。(直接网页翻译......)
自己解释:
一个字符串J,里面是字母组成,有的字母可以代表宝石,有的只是石头;是不是宝石取决于字符串S中是否包含J中的元素。(区分大小写!区分大小写!区分大小写!)
事例:
思路: 1、遍历s;
2、遍历j;
3、统计s中每个字母在j中出现的次数。
代码实现:
package com.mianshi.suanfa.JewelsAndStones;
/**
* Created by macbook_xu on 2018/3/19.
*/
public class FindJewels {
public static int findJewels(String j,String s){
int num = 0;
for (char newS : s.toCharArray()){
for (char newJ : j.toCharArray()){
if (newS==newJ)
num++;
}
}
return num;
}
public static void main(String[] args) {
System.out.print(findJewels("z","ZZZZaaa"));
}
}
总结:虽然作出了这道leetcode上最简单的题目,但是两层循环嵌套使用一个一个去判断对性能还是非常有影响,但是思路还是很清晰的。在网站上看评论区还有其他大神的答案,拿来分享一下!
使用hashset中的contains()方法来判断是否重复:
public int numJewelsInStones(String J, String S) {
int res = 0;
Set setJ = new HashSet();
for (char j: J.toCharArray()) setJ.add(j);
for (char s: S.toCharArray()) if (setJ.contains(s)) res++;
return res;
}
虽然都是两遍遍历,但是没有嵌套,明显效率提升很多,但我是小白,并没有想到,不经常使用set。。。。
还有一个更厉害的代码:正则表达式实现:
public int numJewelsInStones(String J, String S) {
return S.replaceAll("[^" + J + "]", "").length();
}
仅需一行代码。。。。宝宝都看呆了!!!一开始没有理解,后来找了正则对应字符含义:[^xyz]表示一个字符,并且这个字符不是x,y,z,直接把不是宝石的字母去掉,替换后的字符串则全是宝石,长度就为宝石的数量,真的学到了很多,主要学到了解决问题的思想。
还有很多办法,希望大家一起思考,以后每天都会去刷题总结,希望大家一起进步,小白第一天就学这么多了,毕竟还得上班,以后每天更新,我会慢慢从leetcode中easy做到hard,每天做多少分享多少,每周更新一次GitHub,放上解决源码,谢谢阅读。