看了下不知道为什么有的前端卷是不一样的且没有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) 回帖