JS | 教练,我想做习题3

🚀 前言

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

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

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

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

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

📖 题目1:海盗码

当海盗数量发生变化时,请帮助Amaro确认下他的逻辑。

请记住,每次海盗发现宝藏,黄金的数量就等于海盗人数 * 20。

例:

如果海盗数量为2,包括Amaro,则array = [40, 0],这样他就可以将所有黄金保留给自己。

如果包括Amaro在内的海盗数量是3,则array = [59, 0, 1],那么他要拿59金。

如果海盗数量为4,包括Amaro,则array = [79, 0, 1, 0],那么他要取79金。

如果包括Amaro在内的海盗数量为5,则array = [98, 0, 1, 0, 1],那么他要拿98金。

返回应该分配的方案数组。

习题代码

function amaroPlan(pirateNum){

}

📖 题目2:在路上

任务

您刚刚搬入一条完全笔直的街道,n两边的房屋完全相同。自然,您想找出这条街另一侧的人的门牌号码。这条街看起来像这样:

街道如图所示:

1|   |6
3|   |4
5|   |2

右边的偶数增加;左边的逐渐降低,门牌号码开始于1并且有间隔地增加。当n = 3,1对立6,3对立4和5对立2。

例子:

给定您的门牌号address和街道长度,给出在街道n的另一侧的门牌号。

overTheRoad(address, n)
overTheRoad(1, 3) = 6
overTheRoad(3, 3) = 4
overTheRoad(2, 3) = 5
overTheRoad(3, 5) = 8

习题代码

function overTheRoad(address, n){
  //code here
}

📖 题目3:消息验证

您有一个输入字符串,检查它是否是有效消息。为此,您需要计算字符串的数量,然后将数量与子字符串前面的的字符数进行比较。

例如,"3hey5hello2hi"应分为3, hey, 5, hello, 2, hi,函数应返回true,因为它"hey"是3个字符,"hello"5个和"hi"2个字符;当数字和字符数匹配时,结果为true。

笔记:

  • 消息仅由字母和数字组成
  • 数字可以有多个数字:例如"4code13hellocodewars"是有效的消息
  • 每个数字都必须与以下子字符串中的字符数匹配,否则消息无效:例如"hello5""2hi2"无效
  • 如果消息为空字符串,则应返回 true
function isAValidMessage(message){
  // your code
}

📖 题目4:让死鱼游泳

编写一个简单的解析器,将解析并运行Deadfish。

死鱼有4个命令,每个命令长1个字符:

i 增加值(最初是0)

d 减少值

s 平方值

o 将值输出到返回数组

无效字符应被忽略。

parse(“iiisdoso”) => [ 8, 64 ]

0+1+1+1——平方(结果为9)-1输出为8,平方,输出为64。

// Return the output array, and ignore all non-op characters
function parse( data )
{
  
}

📖 题目5:他们是“一样的”吗?

给定两个数组,a和b编写一个函数comp(a, b)(compSame(a, b)在Clojure中),该函数检查两个数组是否具有“相同”元素且具有相同的多重性。“相同”在这里是指其中的元素b是a平方的元素,与顺序无关。
如果都是空数组,返回true。

例子

有效数组

a = [121, 144, 19, 161, 19, 144, 19, 11]  
b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]

comp(a, b)返回true,因为121是11的平方,14641是121的平方,20736是144的平方,361是19的平方,25921是161的平方,依此类推。如果我们用b平方来写元素,这将变得显而易见:

a = [121, 144, 19, 161, 19, 144, 19, 11] 
b = [11*11, 121*121, 144*144, 19*19, 161*161, 19*19, 144*144, 19*19]

无效的数组

如果我们将第一个数字更改为其他数字,则comp可能不再返回true:

a = [121, 144, 19, 161, 19, 144, 19, 11]  
b = [132, 14641, 20736, 361, 25921, 361, 20736, 361]

comp(a,b)返回False,因为132不是a中任何数的平方。

a = [121, 144, 19, 161, 19, 144, 19, 11]  
b = [121, 14641, 20736, 36100, 25921, 361, 20736, 361]

comp(a,b)返回false,因为36100不是a中任意数字的平方。

备注

  • ab可能是[](除R,Shell外的所有语言)。
  • ab可能是nilnullNonenothing(C ++,Elixir,Haskell,PureScript,Pascal,R,Rust,Shell中除外)。

如果a或b有nil(或null或None),这个问题就没有意义了那么返回FALSE。

注意事项

这两个数组的大小(> 0)与function comp中的参数相同。

习题代码

function comp(array1, array2){
  //your code here
}

答案

🍗 题目1的答案

参考答案1:

function amaroPlan(n){
  return [20*n-((n-1)/2|0),...[...Array(n-1)].map((_,i)=>i%2)]
}

参考答案2:

function amaroPlan(pirateNum) {
  const result = Array(pirateNum).fill(0);
  result[0] = pirateNum * 20;
  for (let i = 2; i < pirateNum; i += 2) {
    result[0]--;
    result[i]++;
  }
  return result;
}

参考答案3:

function amaroPlan(pNum){
  const arr = Array.from({length:pNum}, (_, x)=> x % 2 ===0 ? 1 : 0)
    arr[0] += pNum*20 - arr.reduce((a,b)=> a + b, 0)
    return arr
}

🍗 题目2的答案

function overTheRoad(address, n){
  return (n*2+1)-address;
}

🍗 题目3的答案

function isAValidMessage(message){
  // your code
  if (!message) return true

  while (message.length > 0) {
    let num = parseInt(message);
  
    if (isNaN(num)) return false;
    
    message = message.slice((num + "").length);
    
    let str = message.slice(0, num);
    let regex = RegExp('^[a-zA-Z]{' + num + '}$')
    
    if (!regex.test(str)) return false;
    
    message = message.slice(num);
  }
  return true;
}

参考答案2

function isAValidMessage(message) {
    const number = message.split(/[a-z]/i).filter(e => e !== '')
    const word = message.split(/[0-9]/).filter(e => e !== '')
    const filtering = word.map((x,i) => x.length == number[i]).filter(e => e === true).length
    return !message.length || (filtering === number.length && word.length === number.length && message.slice(0, 1).match(/[0-9]/) && !message.slice(-1).match(/[0-9]/)) ? true : false
}

参考答案3

function isAValidMessage(message) {

  if (!/^(\d+[a-z]+)*$/i.test(message))
    return false;
  
  let parts = message.match(/\d+|[a-z]+/gi);

  if (parts)
    for (let i = 0; i < parts.length; i += 2)
      if (+parts[i] !== parts[i + 1].length)
        return false;
    
  return true;
  
  
}

🍗 题目4的答案

参考答案1

// Return the output array, and ignore all non-op characters
function parse( data ) {  
  var v = 0, ret = []
  for (var c of data) {
    switch (c) {
      case 'i' : v++;         break;
      case 'd' : v--;         break;
      case 's' : v=v*v;       break;
      case 'o' : ret.push(v); break;
    }
  }
  return ret;
}

参考答案2

const parse = (data) => {
  let result = []
  let val = 0
  data.split('').forEach(x => {
    switch(x){
      case 'i':
        val++
        break
      case 'd':
        val--
        break
      case 's':
        val*=val
        break
      case 'o':
        result.push(val)
    }
  })
  return result
}

🍗 题目5的答案

参考答案1:

function comp(array1, array2) {
  if(array1 == null || array2 == null) return false;
  array1.sort((a, b) => a - b); array2.sort((a, b) => a - b);
  return array1.map(v => v * v).every((v, i) => v == array2[i]);
}

参考答案2

function comp(a, b) {
  return !!a && !!b && a.map(x => x*x).sort().join() == b.sort().join();
}

🍁后序

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值