欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-11-17 18:50:38
问题:  给定字符串j 代表石头中宝石的类型,和字符串 s代表你拥有的石头。 s 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。 j 中...

问题:

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