首页 > 9.27 网易互娱 前端笔经
头像
电池くん
编辑于 2020-09-27 22:33
+ 关注

9.27 网易互娱 前端笔经

看了下不知道为什么有的前端卷是不一样的且没有js……我的是有node模式的,且题目似乎也不一样
T1 括号匹配问题变种,检验给定字符串是否符合括号匹配,除了普通的左右括号之外还有字符'.',可以匹配左右括号或者空字符
跟原来的括号匹配问题一样用栈,然后再对'.'作处理,简单粗暴
function solution( data ) {
    let stack = [];
    for(let i = 0; i < data.length; i++) {
        if(data[i] === '[' || data[i] === '.') {
            stack.push(data[i])
        } else if (data[i] === ']') {
            let temp = stack.lastIndexOf('[')
            if (temp == -1) {
                let temp2 = stack.pop();
                if(temp2 == undefined) return false;
            } else {
                stack.splice(temp,1);
            }
        }
    }
    if(stack.length == 0) return true;
    else {
        while(stack.length > 0) {
            let temp = stack.pop()
            if (temp == '[') return false;
            else if (stack.length == 0){
                return true;
            } else {
                let temp = stack.lastIndexOf('[')
                if (temp == -1) {
                    let temp2 = stack.pop();
                    if(temp2 == undefined) return false;
                } else {
                    stack.splice(temp,1);
                }
            }
        }
        return true;
    }
}
T2 给出整数数组[p1,p2,...,pn]和整数m,在数组中取数使和为m,可以多次取同一个数,求取数最少的次数
用了贪婪+递归的思路,感觉应该是尽量选最大的,然后发现也有可能次大但可以整除的情况会更少,于是对子数组也做相同处理,但是还是没AC……感觉还是算法刷少了,这个思路应该有问题
function solute(harmList, totalHarm, sum) {// 递归函数
    let temp1 = totalHarm % harmList[0];
    if (temp1 == 0) {
        return sum + totalHarm / harmList[0];
    } else {
        if(harmList.length == 1) {
            return -1;
        }
        for(let i = (totalHarm-temp1) / harmList[0]; i > 0; i--) {
            let result = solute(harmList.slice(1,harmList.length), totalHarm-i*harmList[0], sum+i);
            if (result != -1) {
                return result;
            }
        }
    }
    return solute(harmList.slice(1,harmList.length), totalHarm, sum);
}

function solution( harmList ,  totalHarm ) {
    let sortList = harmList.sort((a,b)=>b-a);
    if (sortList[0] < 0) return -1;
    let sum = 0;
    let result = -1;
    for(let i = 0; i < harmList.length; i++) {
        let res = solute(sortList.slice(i, harmList.length), totalHarm, sum);
        if(res != -1){
            result = result == -1 ? res: Math.min(res,result);
        }
    }
    return result
}
T3 Leetcode第11题 看到这张图应该就知道是哪一题了 这个就不给题解了 反正很简单
T4 A和B打牌,每个人手中有N张牌,规则是每回合出一张牌,面值大者获胜得3分,平局得1分,输了得0分。给出A的出牌顺序和面值以及B的手牌面值,求B能得到的最高分数。
思路是能赢的牌用最小且能赢的牌去赢,打平的牌看看后面能不能赢,必输的牌用最小的牌止损
(更新:诈和了……有hack。)
function solution( tangCards ,  wangCards ) {
    let wangSort = wangCards.sort((a,b) =>a-b);
    let sum = 0;
    for (let i = 0; i < tangCards.length; i++) {
        let found = wangSort.findIndex(element => element > tangCards[i])
        if (found == -1) { // 找不到更大的,退而求找相等的
            found = wangSort.findIndex(element => element == tangCards[i])
            if (found == -1) { // 还是找不到,只能出最小的止损
                wangSort.shift();
            } else { // 找到了,尝试找后面有没有更小的,如果没有出最大的止损,否则出最小的止损
                let temp = tangCards.slice(i, tangCards.length);
                found = temp.findIndex(element => element < wangSort[wangSort.length-1])
                if (found == -1) { // 没找到,出最大的止损
                    wangSort.pop();
                    sum += 1;
                } else {
                    if(wangSort.shift() == tangCards[i]) {
                        sum += 1;
                    }
                }
            }
        } else {
            wangSort.splice(found, 1);
            sum += 3;
        }
    }
    return sum;
}


全部评论

(0) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

热门推荐