leetcode宝石与石头Javascript实现方法

问题:

 给定字符串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})
第一次写博客,希望大家可以批评指正。有什么问题和想法都可以留言。欢迎大家积极交流评论。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值