前言:
平时遇到的问题值得思考便记录下来,以备交流学习,以下代码都经过经控制台有效测试,代码段可独立运行
ps:本篇重头戏在去重
目录
题目:
题1:根据以上描述,求出你拥有的宝石的个数?
题2:根据以上描述,求出找出你拥有的宝石的种类?
去重:
最终解题方式:
题目:
给定字符串J
代表石头中宝石的类型,和字符串 S
代表你拥有的石头。 S
中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J
中的字母不重复,J
和 S
中的所有字符都是字母。字母区分大小写,因此"a"
和"A"
是不同类型的石头。
注意:
S
和 J
最多含有50个字母。J
中的字符不重复。题1:根据以上描述,求出你拥有的宝石的个数?
示例 1:
输入: J = "aA", S = "aAAbbbb"
输出: 3
示例 2:
输入: J = "z", S = "ZZ"
输出: 0
思路:
两层循环,此处仅找出J和S中相同的字符个数,即你拥有的宝石的个数
用了ES6的 for…of 语法也更简洁高效
var numJewelsInStones = function(J, S) {
var count = 0;
for (var j of J) {
for (var s of S) {
if (j === s) {
count ++;
}
}
}
return count; };
var J=['A','B'];
var S=['A','B','B','a','b','a'];
numJewelsInStones(J,S);
以上参照 https://blog.csdn.net/romeo12334/article/details/81198686
题2:根据以上描述,求出找出你拥有的宝石的种类?
示例 1:
输入: J = "aA", S = "aAAbbbb"
输出: 2
示例 2:
输入: J = "z", S = "ZZ"
输出: 0
初看这题有点懵,这题有点难度,哎呀小坏蛋,只能去重+匹配双重暴击方能让你安生了!
以上对比输出拥有的宝石数已经有了,只要将剩下的去重功能写进代码里即可;
但去重功能的代码块放在什么位置,用哪种方式比较合适,这是值得思考的,一步步来;
首先列出去重的方案:
方案一:利用JQ的$.unique() 函数
$.unique() 函数用于对DOM元素数组进行排序,并移除重复的元素。
注意: 仅适用于DOM元素数组,不能处理字符串或者数字数组。
var S=['A','B','B','a','b','a'];
console.log($.unique(S));
分析:代码比较简短,使用方便但通用性不好;
思考:不过这种方式,不能处理数字数组还不能处理数字的字符串吗?
var string = '2 2 4 3 1 2 4'
console.log($.unique(string.split(' '))) // ["2", "4", "3", "1"]
ps:前提是没有限制数组转字符串
方案二:两个for循环将S中重复的元素删除 相关内容可参照 https://blog.csdn.net/webxiaoma/article/details/53639912
function undulpicate(S) {
for (var i = 0; i < S.length; i++) {
for (var j = i + 1; j < S.length; j++) {
//注意 ===为值和数据类型完全一致
if (S[i] === S[j]) {
S.splice(j, 1);
j--;
}
}
}
return S;
}
var S = ['A', 'B', 'B', 'a', 'b', 'a'];
undulpicate(S); // ["A", "B", "a", "b"]
其他方式可看 ------JavaScript 9种数组去重及性能分析https://blog.csdn.net/zwkkkk1/article/details/80337451
去重的方案那么多,当然选性能较好的:
function sort1(arr) {
let obj = {};
for (let i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
obj[arr[i]] = 1;
}
}
return Object.keys(obj);
}
var S=[1,3,4,3,22,4];
sort1(S)
简短版:源自 https://blog.csdn.net/fe_dev/article/details/78110153
function unique(S) {
return Array.from(new Set(S))//去重功能仅需一句解决
}
var S=["a",'A','B','B','a','b','a'];
console.log(unique(S))
思绪太多理一理下面该最终结果登场了;
最终解题方式:
var numJewelsInStones = function(J, S) {
var count = 0;
S=Array.from(new Set(S));
//去重功能,放在这里较为合适既可以去重又可以减少后面的循环执行次数
for (var j of J) {
for (var s of S) {
if (j === s) { count ++; }
}
}
return count;
};
var J=['A','B'];
var S=['A','B','B','a','b','a'];
numJewelsInStones(J,S); //2
这里得出的结果即你拥有的宝石种类的数目
正真的代码只有7行少到难以置信,其实仔细想想还可以更少,欢迎赐教