乐趣区

关于javascript: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=='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);
}

???? 后序

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

求关注求点赞 ????~~????????????

能够关注我的公众号: 前端毛小悠 。欢送浏览

退出移动版