问题:
第一次写博客,希望大家可以批评指正。有什么问题和想法都可以留言。欢迎大家积极交流评论。
给定字符串J
代表石头中宝石的类型,和字符串 S
代表你拥有的石头。 S
中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J
中的字母不重复,J
和 S
中的所有字符都是字母。字母区分大小写,因此"a"
和"A"
是不同类型的石头。
方法1:作为一个刚刷leetcode的新手,第一次我的解法是这样的:
var
numJewelsInStones =
function(
J,
S) {
let
array = [];
let
count =
0;
array =
S.
split(
'');
array.
forEach(
item
=>{
if(
J.
includes(
item)){
count++;
}
})
return
count;
};
这种方法的思路是将“石头”分成一个数组,如果“宝石”中包括里面的元素,那么count++;貌似没啥毛病。但是此方法的复杂度是m*n(石头的长度m和宝石的长度n)。因为include方法也是需要遍历字符串的长度的。
方法2:
var
numJewelsInStones =
function(
J,
S) {
let
array1 =
J.
split(
'');
let
array2 =
S.
split(
'');
let
count =
0;
let
obj = {};
array1.
forEach(
item
=>{
obj[
item] =
1; //将宝石变成键值对的存储对象
})
array2.
forEach(
item
=>{
if(
array1[
item]){
count++;
}
}
)
return
count;
};
因为宝石是不重复的,可以将宝石存储为键值对的形式,keys就是宝石的类型。如果在石头中key存在,那么count++;不存在的话,array1[item]是undefined,那么count不增加。方法2复杂度更为简单。
类似问题:字符串的去重?
var
clearRepeatWords =
function(
S) {
let
array1 =
S.
split(
'');
let
obj = {};
// let array2 = [];
array1.
forEach(
item
=>{
if(!
obj[
item]){
// array2.push(item);
obj[
item] =
1;
}
})
let
array2 =
Object.
keys(
obj);
let
newString =
array2.
join(
'');
return
newString;
};
这里去重也用到了键值对的方式。将字符串中的每个子元素设置键值对,如果键值不存在,就放进obj中。最后我们可以把item存到一个数组,也可以直接使用对象的Object.keys()来取键值。
知识补充:
1.字符串与数组之间的转换
let
arr = [
a,
b,
c];
let
string1 =
arr.
join(
'');
//"abc"
let
string2 =
arr.
join(
'-');
//"a-b-c"
let
arr1 =
string1.
split(
'');
//[a,b,c]
let
arr2 =
string2.
split(
'-');
//[a,b,c]
2.数组转换为键值对
var
obj = {};
//方法1
var
a
= [
1
,
2
,
3
,
4
,
5
];
for (
var
x
in
arr){
obj[
x] =
x;
}
//方法2
a.
map(
function(
item,
i){
return
b[
i]=
item; //注意map方法是需要return;否则会是undefined;
});
//方法3
var
a = [
'a',
'b',
'c']
var
obj = {}
a.
forEach((
item,
index)
=>{
obj[
index] =
item})