js实例教程-leetcode宝石与石头Javascript实现方法(代码教程)

发布时间:2018-11-29 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了js实例教程-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})

问题:

 给定字符串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})

觉得可用,就经常来吧!Javascript技巧 脚本宝典 欢迎评论哦! js技巧,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的js实例教程-leetcode宝石与石头Javascript实现方法(代码教程)全部内容,希望文章能够帮你解决js实例教程-leetcode宝石与石头Javascript实现方法(代码教程)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。