关于javascript:JS-教练我想做习题9

54次阅读

共计 4320 个字符,预计需要花费 11 分钟才能阅读完成。

???? 前言

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

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

???? 后序

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

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

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

正文完
 0