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

JS | 教练,我想做习题9

前端毛小悠发布于 今天 06:09

🚀 前言

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

本系列文章旨在通过练习来提高JavaScript的能力,一起愉快的做题吧。😀😀😀

以下每道题,二毛我都有尝试做一遍。建议限时训练,比如限定为半小时,如果半小时内想不出来,可以结合文章末尾的参考答案来思考。

可以在下方评论区留言或者加我的微信:code\_maomao。期待你的到来。

求关注求点赞👍\~~~😘😘😘

📖 题目1:标签生成器

营销团队花费太多时间输入标签。
让我们用自己的标签生成器帮助他们!

这是规则:

  • 它必须以井号(#)开头。
  • 所有单词的首字母必须大写。
  • 如果最终结果超过140个字符,则必须返回false
  • 如果输入或结果为空字符串,则必须返回false

例子

" Hello there thanks for trying my Kata"  =>  "#HelloThereThanksForTryingMyKata"

" Hello World " => "#HelloWorld"

"" => false

习题代码

function generateHashtag (str) {

}

📖 题目2:合并的字符串检查器

您面临编写一个算法来检查给定字符串s是否可以由其他两个字符串part1和part2构成的挑战。

限制是part1和part2中的字符应与s中的顺序相同。

面试官为您提供以下示例,并告诉您从给定的测试案例中找出其余的示例。

例如:

'codewars' is a merge from 'cdw' and 'oears':

s: c o d e w a r s = codewars

part1: c d w = cdw

part2: o e a r s = oears

习题代码

function isMerge(s, part1, part2) {

return false;

}

📖 题目3:约瑟夫斯幸存者

您必须正确返回谁是“幸存者”,即:Josephus排列的最后一个元素。

基本上,假设将n个人围成一个圈,并按照k个元素的步骤将其消除,如下所示:

josephus_survivor(7,3) => means 7 people in a circle;

one every 3 is eliminated until one remains

[1,2,3,4,5,6,7] - initial sequence

[1,2,4,5,6,7] => 3 is counted out

[1,2,4,5,7] => 6 is counted out

[1,4,5,7] => 2 is counted out

[1,4,5] => 7 is counted out

[1,4] => 5 is counted out

[4] => 1 counted out, 4 is the last element - the survivor!

注意和提示:使用另一套解决方案来检查您的功能可能会有所帮助,但是由于将使用更大的数字,因此使用数组/列表来计算幸存者的数量可能会太慢;您可以假设n和k都将始终> = 1。

习题代码

function josephusSurvivor(n,k){

//your code here

}

答案

🍗 题目1的答案

参考答案1:

function generateHashtag (str) {

return str.length > 140 || str === '' ? false :

'#' + str.split(' ').map(capitalize).join('');

}

function capitalize(str) {

return str.charAt(0).toUpperCase() + str.slice(1);

}

参考答案2:

function generateHashtag (str) {

if(!str || str.length < 1) return false;

var r = '#' + str.split(' ').map(function(el) {

return el.charAt(0).toUpperCase() + el.slice(1).toLowerCase();

}).join('');

return r.length > 140?false:r;

}

参考答案3:

function generateHashtag (str) {

var hashtag = str.split(' ').reduce(function(tag, word) {

return tag + word.charAt(0).toUpperCase() + word.substring(1);

}, '#');

return hashtag.length == 1 || hashtag.length > 140 ? false : hashtag;

}

参考答案4:

function generateHashtag(str) {

var hashed = '#' + str.split(' ').map(function(v) {return v.charAt(0).toUpperCase() + v.slice(1);}).join('');

return hashed.length > 140 || str == "" ? false : hashed;

}

参考答案5:

function generateHashtag (str) {

var s = "#" + str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()}).split(" ").join("");

if(str && s.length <= 140){

return s;

} return false;

}

🍗 题目2的答案

参考答案1:

function isMerge(s, part1, part2) {

return !s ? !(part1 || part2) :

s[0] == part1[0] && isMerge(s.slice(1), part1.slice(1), part2) ||

s[0] == part2[0] && isMerge(s.slice(1), part1, part2.slice(1));

}

参考答案2:

function isMerge(s, part1, part2) {

if (s === "" && part1 === "" && part2 === "") return true;

if (s !== ""){

if (s[0] === part1[0] && part1[0] === part2[0]){

// we make two branches of an recursion and get OR of the answers

return (isMerge(s.slice(1), part1.slice(1), part2) || isMerge(s.slice(1), part1, part2.slice(1)));

} else if (s[0] === part1[0]){

return isMerge(s.slice(1), part1.slice(1), part2);

} else if (s[0] === part2[0]){

return isMerge(s.slice(1), part1, part2.slice(1));

}

}

return false;

}

参考答案3:

const isMerge = (s, part1, part2) =>

(fn => !s ? !(part1 || part2) : fn(part1, part2) || fn(part2, part1))

((p1, p2) => s[0] === p1[0] && isMerge(s.slice(1), p1.slice(1), p2));

参考答案4:

var isMerge = (s, x, y) => !s  ? !(x || y) : check(s, x, y) || check(s, y, x);

var check = (a, b, c) => a[0] == b[0] && isMerge(a.slice(1), b.slice(1), c);

参考答案5:

const isMerge = (s3, s1, s2) => {

let dp = [];

if (s1 === "") {

return s2 === s3;

}

if (s2 === "") {

return s1 === s3;

}

if (s1.length + s2.length !== s3.length) {

return false;

}

for (let i = 0; i < s1.length + 1; i++) {

dp.push([]);

for (let j = 0; j < s2.length + 1; j++) {

if (i === 0 && j === 0) {

dp[i].push(true);

}

else {

let char = s3.charAt(i + j - 1);

if (char === s1.charAt(i - 1) && dp[i -1][j]) {

dp[i].push(true);

}

else if (char === s2.charAt(j - 1) && dp[i][j - 1]) {

dp[i].push(true);

}

else {

dp[i].push(false);

}

}

}

}

return dp[s1.length][s2.length];

};

🍗 题目3的答案

参考答案1:

function josephusSurvivor(n, k){

return n < 1 ? 1 : (josephusSurvivor(n - 1, k) + --k) % n + 1;

}

参考答案2:

function josephusSurvivor(n,k){

res=1;

for (var i=1;i<=n;i++) res=(res+k-1)%i+1;

return res;

}

参考答案3:

function josephusSurvivor(n,k){

var people = [],

p = 0;

for (var i = 0; i < n; i++) { people.push(i+1); }

while (people.length > 1) {

p = (p + k - 1) % people.length;

people.splice(p, 1);

}

return people.pop();

}

参考答案4:

const josephusSurvivor = (n, k) =>

n - 1 ? (josephusSurvivor(n - 1, k) + k - 1) % n + 1 : 1;

参考答案5:

function josephusSurvivor(n, k) {

// Source: https://en.wikipedia.org/wiki/Josephus_problem#The_general_case

// (I couldn't come up with the formula myself :p)

return n === 1 ? 1 : ((josephusSurvivor(n - 1, k) + k - 1) % n) + 1;

}

🍁后序

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

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

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

javascript前端

阅读 44发布于 今天 06:09

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

avatar

前端毛小悠

11 声望

4 粉丝

0 条评论

得票时间

avatar

前端毛小悠

11 声望

4 粉丝

宣传栏

🚀 前言

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

本系列文章旨在通过练习来提高JavaScript的能力,一起愉快的做题吧。😀😀😀

以下每道题,二毛我都有尝试做一遍。建议限时训练,比如限定为半小时,如果半小时内想不出来,可以结合文章末尾的参考答案来思考。

可以在下方评论区留言或者加我的微信:code\_maomao。期待你的到来。

求关注求点赞👍\~~~😘😘😘

📖 题目1:标签生成器

营销团队花费太多时间输入标签。
让我们用自己的标签生成器帮助他们!

这是规则:

  • 它必须以井号(#)开头。
  • 所有单词的首字母必须大写。
  • 如果最终结果超过140个字符,则必须返回false
  • 如果输入或结果为空字符串,则必须返回false

例子

" Hello there thanks for trying my Kata"  =>  "#HelloThereThanksForTryingMyKata"

" Hello World " => "#HelloWorld"

"" => false

习题代码

function generateHashtag (str) {

}

📖 题目2:合并的字符串检查器

您面临编写一个算法来检查给定字符串s是否可以由其他两个字符串part1和part2构成的挑战。

限制是part1和part2中的字符应与s中的顺序相同。

面试官为您提供以下示例,并告诉您从给定的测试案例中找出其余的示例。

例如:

'codewars' is a merge from 'cdw' and 'oears':

s: c o d e w a r s = codewars

part1: c d w = cdw

part2: o e a r s = oears

习题代码

function isMerge(s, part1, part2) {

return false;

}

📖 题目3:约瑟夫斯幸存者

您必须正确返回谁是“幸存者”,即:Josephus排列的最后一个元素。

基本上,假设将n个人围成一个圈,并按照k个元素的步骤将其消除,如下所示:

josephus_survivor(7,3) => means 7 people in a circle;

one every 3 is eliminated until one remains

[1,2,3,4,5,6,7] - initial sequence

[1,2,4,5,6,7] => 3 is counted out

[1,2,4,5,7] => 6 is counted out

[1,4,5,7] => 2 is counted out

[1,4,5] => 7 is counted out

[1,4] => 5 is counted out

[4] => 1 counted out, 4 is the last element - the survivor!

注意和提示:使用另一套解决方案来检查您的功能可能会有所帮助,但是由于将使用更大的数字,因此使用数组/列表来计算幸存者的数量可能会太慢;您可以假设n和k都将始终> = 1。

习题代码

function josephusSurvivor(n,k){

//your code here

}

答案

🍗 题目1的答案

参考答案1:

function generateHashtag (str) {

return str.length > 140 || str === '' ? false :

'#' + str.split(' ').map(capitalize).join('');

}

function capitalize(str) {

return str.charAt(0).toUpperCase() + str.slice(1);

}

参考答案2:

function generateHashtag (str) {

if(!str || str.length < 1) return false;

var r = '#' + str.split(' ').map(function(el) {

return el.charAt(0).toUpperCase() + el.slice(1).toLowerCase();

}).join('');

return r.length > 140?false:r;

}

参考答案3:

function generateHashtag (str) {

var hashtag = str.split(' ').reduce(function(tag, word) {

return tag + word.charAt(0).toUpperCase() + word.substring(1);

}, '#');

return hashtag.length == 1 || hashtag.length > 140 ? false : hashtag;

}

参考答案4:

function generateHashtag(str) {

var hashed = '#' + str.split(' ').map(function(v) {return v.charAt(0).toUpperCase() + v.slice(1);}).join('');

return hashed.length > 140 || str == "" ? false : hashed;

}

参考答案5:

function generateHashtag (str) {

var s = "#" + str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()}).split(" ").join("");

if(str && s.length <= 140){

return s;

} return false;

}

🍗 题目2的答案

参考答案1:

function isMerge(s, part1, part2) {

return !s ? !(part1 || part2) :

s[0] == part1[0] && isMerge(s.slice(1), part1.slice(1), part2) ||

s[0] == part2[0] && isMerge(s.slice(1), part1, part2.slice(1));

}

参考答案2:

function isMerge(s, part1, part2) {

if (s === "" && part1 === "" && part2 === "") return true;

if (s !== ""){

if (s[0] === part1[0] && part1[0] === part2[0]){

// we make two branches of an recursion and get OR of the answers

return (isMerge(s.slice(1), part1.slice(1), part2) || isMerge(s.slice(1), part1, part2.slice(1)));

} else if (s[0] === part1[0]){

return isMerge(s.slice(1), part1.slice(1), part2);

} else if (s[0] === part2[0]){

return isMerge(s.slice(1), part1, part2.slice(1));

}

}

return false;

}

参考答案3:

const isMerge = (s, part1, part2) =>

(fn => !s ? !(part1 || part2) : fn(part1, part2) || fn(part2, part1))

((p1, p2) => s[0] === p1[0] && isMerge(s.slice(1), p1.slice(1), p2));

参考答案4:

var isMerge = (s, x, y) => !s  ? !(x || y) : check(s, x, y) || check(s, y, x);

var check = (a, b, c) => a[0] == b[0] && isMerge(a.slice(1), b.slice(1), c);

参考答案5:

const isMerge = (s3, s1, s2) => {

let dp = [];

if (s1 === "") {

return s2 === s3;

}

if (s2 === "") {

return s1 === s3;

}

if (s1.length + s2.length !== s3.length) {

return false;

}

for (let i = 0; i < s1.length + 1; i++) {

dp.push([]);

for (let j = 0; j < s2.length + 1; j++) {

if (i === 0 && j === 0) {

dp[i].push(true);

}

else {

let char = s3.charAt(i + j - 1);

if (char === s1.charAt(i - 1) && dp[i -1][j]) {

dp[i].push(true);

}

else if (char === s2.charAt(j - 1) && dp[i][j - 1]) {

dp[i].push(true);

}

else {

dp[i].push(false);

}

}

}

}

return dp[s1.length][s2.length];

};

🍗 题目3的答案

参考答案1:

function josephusSurvivor(n, k){

return n < 1 ? 1 : (josephusSurvivor(n - 1, k) + --k) % n + 1;

}

参考答案2:

function josephusSurvivor(n,k){

res=1;

for (var i=1;i<=n;i++) res=(res+k-1)%i+1;

return res;

}

参考答案3:

function josephusSurvivor(n,k){

var people = [],

p = 0;

for (var i = 0; i < n; i++) { people.push(i+1); }

while (people.length > 1) {

p = (p + k - 1) % people.length;

people.splice(p, 1);

}

return people.pop();

}

参考答案4:

const josephusSurvivor = (n, k) =>

n - 1 ? (josephusSurvivor(n - 1, k) + k - 1) % n + 1 : 1;

参考答案5:

function josephusSurvivor(n, k) {

// Source: https://en.wikipedia.org/wiki/Josephus_problem#The_general_case

// (I couldn't come up with the formula myself :p)

return n === 1 ? 1 : ((josephusSurvivor(n - 1, k) + k - 1) % n) + 1;

}

🍁后序

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

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

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

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

回到顶部