1、判断两个升序数组其中一个是另外一个数组的子集,需要满足以下两个条件:
- 数组N的所有元素都能在数组M中找到;
- 数组N项中元素重复项的个数不能大于数组M中元素重复项的个数。
看到判端是否子集,第一时间想到了遍历数组M,用 indexOf 来判端是包含N的中的每一项, 嗯,第一个条件满足了,但第二个条件??我怎么知道那个数组的重复项数大呢?
function isSubset(arrM,arrN){//两数组均为升序排序
let m = arrM.length;
let n = arrN.length;
let i = 0, j = 0;
while(m > n && i < m && j < n){
if(arrM[i] < arrN[j]){//M数组有重复项
i++;
}else if(arrM[i] > arrN[j]){//N数组重复项数大于M数组重复项数
return false;
}else{//两项相等
i++;
j++;
}
}
if(j < n){//N数组元素不全在M数组内
return false;
}else{
return true
}
}
let arrM = [1,2,2,3,3,4,4,5,5]
let arrN = [1,2,3,4,5]
console.log(isSubset(arrM,arrN))//true
复制代码
2、括号的匹配问题,如{()},{[()]},({[]})都匹配的
一开没什么思路,后来经提示可以用栈,栈是什么??懵懵,嗯,先进后出,想起来了。。。
function isBracketsMathch(str){
const leftBracketReg =/[\(\{\[]/; //判断左括号
let stack = []; // 栈这样写??
let leftBracket;
let brackets = str.split('');
for(let key of brackets){ //这里不用for...of,得到的value是无序的
let value = brackets[key]
if(leftBracketReg.test(value)){
stack.push(value);
}else{
switch(value){ //与右括号作对比
case ')' : {
leftBracket = stack.pop();
if(leftBracket !== '('){
return false;
}
break;
}
case ']' : {
leftBracket = stack.pop();
if(leftBracket !== '['){
return false;
}
break;
}
case '}' : {
leftBracket = stack.pop();
if(leftBracket !== ']'){
return false;
}
break;
}
}
}
}
return stack.length === 0 ? true : false;
}
let str = '{()[]}';
console.log(isBracketsMathch(str))//true
复制代码
第一次写文章,之前一直想写些东西,但是不知道写些什么好,感觉很多东西网上都有,自己还有必要去写吗???疑问中又过了n月,写得不是很好,可能有些地方写得不对,但我终于迈出第一步了。。。。。。