题目:
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。 (字母区分大小写)
var J="a"
var S="jfuoaeuoscalia"
function num(J,S){
return S.split('').filter(i=>J.includes(i)).length
}
num(J,S) //3
这是用split将S里的每个字符串分开,再从中筛选出符合J的字符,得出宝石的数量。
下面是另一种解法:
function num(J,S){
let newS = S;
for(let i=0;i<J.length;i++){
newS= newS.replace(new RegExp(J[i],'g'),"");
}
return S.length-newS.length
};
num(J,S) //3
使用正则,找到匹配J的宝石,把它变空字符串,得到的newS是已经筛选掉J的其他所有宝石,用总S-筛掉J的newS,最后得出J的宝石数量。(个人觉得还是第一种解法比较简单)
其中知识:
RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
语法:stringObject.replace(regexp/substr,replacement)
创建 RegExp 对象的语法:new RegExp(pattern, attributes);
replace() 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串。原字符串不会改变。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。如果pattern是字符串,则仅替换第一个匹配项。
语法:str.replace(regexp|substr, newSubStr|function)
注:在进行全局的搜索替换时,正则表达式需包含 g 标志。此时如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。