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})
推荐阅读
-
leetcode宝石与石头Javascript实现方法(代码教程)
-
用Json实现PHP与JavaScript间数据交换的方法详解_PHP教程
-
用Json实现PHP与JavaScript间数据交换的方法详解_PHP教程
-
PHP与javascript实现变量交互的示例代码_PHP教程
-
javascript 小型动画组件与实现代码_PHP教程
-
用javascript实现源代码的隐藏与解密的方法_javascript技巧
-
leetcode宝石与石头Javascript实现方法(代码教程)
-
PHP执行zip与rar解压缩方法实现代码_PHP教程
-
用javascript实现源代码的隐藏与解密的方法_javascript技巧