筛选出宝石

316 阅读1分钟

题目:
给定字符串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() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。