JS | 教练,我想做习题11

🚀 前言

大家好呀,我是毛小悠,可以叫我二毛,在家中排行老二,是一名前端开发工程师。

本系列文章旨在通过练习来提高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);
}

🍁后序

本系列会定期更新的,题目会由浅到深的逐步提高。

求关注求点赞 👍~~🍭🍭🍭

可以关注我的公众号:前端毛小悠。欢迎阅读

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值