富途面试其中的2道手写代码题

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月,写得不是很好,可能有些地方写得不对,但我终于迈出第一步了。。。。。。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值