🚀 前言
大家好呀,我是毛小悠,可以叫我二毛,在家中排行老二,是一名前端开发工程师。
本系列文章旨在通过练习来提高JavaScript的能力,一起愉快的做题吧。😀😀😀
以下每道题,二毛我都有尝试做一遍。建议限时训练,比如限定为半小时,如果半小时内想不出来,可以结合文章末尾的参考答案来思考。
可以在下方评论区留言或者加我的微信:code_maomao。期待你的到来。
求关注求点赞👍~~~😘😘😘
📖 题目1:香蕉
给定一串字母a,b,n,您可以通过去除各种字母然后从左到右阅读来制作“香蕉”一词的几种不同方法?
(使用-表示划线字母)
例
输入值
bbananana
输出量
b-anana--
b-anan--a
b-ana--na
b-an--ana
b-a--nana
b---anana
-banana--
-banan--a
-bana--na
-ban--ana
-ba--nana
-b--anana
笔记
- 您必须输出所有可能的香蕉,但顺序无关紧要,
习题代码:
var bananas = function(s) {
// Your code here!
return []
}
📖 题目2:二十一点记分员
完成确定纸牌游戏二十一点(又名21)中一手得分的功能。
该函数接收代表手牌中每个卡牌值的字符串数组(“ 2”,“ 3”,…,“ 10”,“ J”,“ Q”,“ K”或“ A”),并应返回手上的分数(整数)。
计分规则:
号码卡计为其面值(2到10)。J,Q和K数为10。王牌可以数为1或11。
返回小于或等于21的牌的最高分数。如果没有小于或等于21的分数,则返回大于21的最小分数。
例子
["A"] ==> 11
["A", "J"] ==> 21
["A", "10", "A"] ==> 12
["5", "3", "7"] ==> 15
["5", "4", "3", "2", "A", "K"] ==> 25
习题代码:
function scoreHand(cards) {
// TODO
}
答案
🍗 题目1的答案
参考答案1:
var bananas = function(s) {
let r = {}, re = /^-*b-*a-*n-*a-*n-*a-*$/
function f(s, i) {
if(re.exec(s)) r[s] = true
if(i < s.length) {
f(s.slice(0,i) + '-' + s.slice(i+1),i+1)
f(s,i+1)
}
}
f(s, 0)
return Object.keys(r)
}
参考答案2:
var bananas = function(s) {
let stack = [s];
let solutions = [];
let analyzed = {};
let found = {};
while (stack.length > 0) {
let e = stack.pop();
if (isBanana(e) && !found[e]) {
found[e] = true;
solutions.push(e)
} else {
for (let i=0; i < e.length; i++) {
if (e.charAt(i) !== '-') {
let candidate = setCharAt(e, i, '-');
if (hasChanceToWork(candidate) && !analyzed[candidate] ) {
analyzed[candidate] = true;
stack.push(candidate);
}
}
}
}
}
return solutions;
}
var hasChanceToWork = function(candidateSolution) {
let banana = 'banana'.split('');
let index = 0;
while (index < candidateSolution.length) {
if (candidateSolution[index] === banana[0]) {
banana.shift();
}
index++;
}
return banana.length === 0;
}
var isBanana = function(s) {
let bananaIndex = 0;
let index = 0;
while (index < s.length) {
if (s.charAt(index) != '-') {
if(s.charAt(index) !== 'banana'.charAt(bananaIndex)) {
return false;
} else {
bananaIndex++;
index++;
}
} else {
index++;
}
}
return true;
}
var setCharAt = function(string, index, character) {
let modified = string.split('');
modified[index] = character;
return modified.join('');
}
参考答案3:
var bananas = function(s) {
var r=[];
for(var a=0; a<s.length; a++)
if(s[a]=='b')
for(var b=a+1; b<s.length; b++)
if(s[b]=='a')
for(var c=b+1; c<s.length; c++)
if(s[c]=='n')
for(var d=c+1; d<s.length; d++)
if(s[d]=='a')
for(var e=d+1; e<s.length; e++)
if(s[e]=='n')
for(var f=e+1; f<s.length; f++)
if(s[f]=='a')
r.push('-'.repeat(a)+"b"+'-'.repeat(b-a-1)+"a"+
'-'.repeat(c-b-1)+"n"+'-'.repeat(d-c-1)+"a"+
'-'.repeat(e-d-1)+"n"+'-'.repeat(f-e-1)+"a"+
'-'.repeat(s.length-f-1));
return r;
}
参考答案4:
const r = /^-*b-*a-*n-*a-*n-*a-*$/;
const addDash = (s, i) => [...s].map((v,x) => x==i?'-':v).join('')
const bananas = (s, i) => {
i = i || 0;
let results = [];
if(r.test(s)){
results.push(s);
return results;
}
for(; i < s.length; i++){
let tmpStr = addDash(s, i);
results.push(...bananas(tmpStr, i+1));
}
return results;
}
参考答案5:
var bananas = function(s, text = 'banana') {
if (s.length < text.length) return []
if (!text.length) return [ s.split('').map(() => '-').join('') ]
return [].concat(
s[0] === text[0] ? bananas(s.slice(1), text.slice(1)).map(x => s[0] + x) : [],
bananas(s.slice(1), text).map(x => '-' + x)
)
}
🍗 题目2的答案
参考答案1:
const cardsMap = {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, J: 10, Q: 10, K: 10, A: 1}
const scoreHand = cards => {
const sum = cards.reduce((acc, card) => acc + cardsMap[card], 0)
return sum < 12 && cards.includes('A') ? sum + 10 : sum
}
参考答案2:
function scoreHand(cards){
var score = 0;
var numAces = 0;
for(i=0;i<cards.length;i++){
console.log(cards[i]);
switch(cards[i]){
case 'A':
score += 11;
numAces++;
break;
case 'K':
case 'Q':
case 'J':
score += 10;
break;
default:
score += parseInt(cards[i]);
}
}
while (numAces > 0 && score > 21){
score -= 10;
numAces--;
}
return score;
}
参考答案3:
function scoreHand(cards) {
var aces = 0
, score = cards.reduce(function (s, c) {
if (c === 'A') { aces++; return s + 11 }
return /\d/.test(c) ? s + parseInt(c) : s + 10
}, 0)
while (aces-- && score > 21) score -= 10
return score
}
参考答案4:
/**
* @param cards An array of strings representing each card
* @returns number Score of the hand
*/
function scoreHand(hand)
{
var score = 0;
var nbAce = 0;
hand.forEach(function(card) {
var kurd = parseInt(card);
if (kurd) {
score += kurd;
} else if (card != 'A') {
score += 10;
} else {
++nbAce
score += 11
}
});
if (nbAce !== 0) {
for (var i = 0; i < nbAce; i++) {
if (score > 21) {
score -= 10;
}
}
}
return score;
}
参考答案5:
function scoreHand(cards) {
let s=cards.reduce((s,c)=>s+(c=='A' ? 1 : isNaN(+c)?10:+c ), 0)
return s + 10 * (cards.includes('A') && s<12);
}
🍁后序
本系列会定期更新的,题目会由浅到深的逐步提高。
求关注求点赞 👍~~🍭🍭🍭
可以关注我的公众号:前端毛小悠。欢迎阅读