【JS】JS | 教练,我想做习题11

JS | 教练,我想做习题11

前端毛小悠发布于 22 分钟前

🚀 前言

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

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

}

🍁后序

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

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

可以关注我的公众号:前端毛小悠。欢迎阅读
【JS】JS | 教练,我想做习题11

javascript前端

阅读 17发布于 22 分钟前

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议

avatar

前端毛小悠

14 声望

4 粉丝

0 条评论

得票时间

avatar

前端毛小悠

14 声望

4 粉丝

宣传栏

🚀 前言

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

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

}

🍁后序

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

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

可以关注我的公众号:前端毛小悠。欢迎阅读
【JS】JS | 教练,我想做习题11

以上是 【JS】JS | 教练,我想做习题11 的全部内容, 来源链接: www.h5w3.com/114978.html

回到顶部