Codewars刷题分享---2(js)

157 阅读2分钟

1.从网址中提取域名Extract the domain name from a URL

描述

编写一个函数,当给定一个 URL 作为字符串时,只解析出域名并将其作为字符串返回。例如:

* url = "http://github.com/carbonfive/raygun" -> domain name = "github"
* url = "http://www.zombie-bites.com"         -> domain name = "zombie-bites"
* url = "https://www.cnet.com"                -> domain name = cnet"

解题思路

去除URL域名前的所有字符,返回只有域名及后缀的字符串,例如(github.com/carbonfive/raygun; zombie-bites.com)

用split()方法切割对域名后的 . 进行切割并返回切割后的第一个字符串就得到了域名

代码
function domainName(url){
  url = url.replace("https://", '');
  url = url.replace("http://", '');
  url = url.replace("www.", '');
  return url.split('.')[0];
};

2.创建电话号码Create Phone Number

描述

编写一个接受 10 个整数(介于 0 和 9 之间)的数组的函数,该数组以电话号码的形式返回这些数字的字符串。

描述

createPhoneNumber([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) // => returns "(123) 456-7890"

返回的格式必须正确才能完成此质询。

不要忘记右括号后面的空格!

解题思路

简单粗暴解法:直接定义题目要求返回的格式 (xxx) xxx-xxxx, 用for循环对应数组的每个数字去替换X

代码
function createPhoneNumber(numbers){
  let phnum = "(xxx) xxx-xxxx";
  for (let i=0; i < numbers.length; i++) {
    phnum = phnum.replace('x', numbers[i] )
  }
  return phnum;
}

3. 使用函数计算Calculating with Functions

描述

这次我们想使用函数编写计算并获得结果。让我们看一些例子:

seven(times(five())); // must return 35
four(plus(nine())); // must return 13
eight(minus(three())); // must return 5
six(dividedBy(two())); // must return 3

要求:

  • 从 0(“零”)到 9(“九”)的每个数字必须有一个函数
  • 以下每个数学运算都必须有一个函数:加、减、乘、除以
  • 每个计算只包含一个运算和两个数字
  • 最外层函数表示左操作数,最内层函数表示右操作数
  • 除法应为整数除法。例如,这应该返回 ,而不是 :2``2.666666...
eight(dividedBy(three()));

解题思路

手写计算函数
(1) 以console.log(seven(times(five())))为例,
  从开发者工具中断点调试可以看出,函数调用顺序为five(),times(),seven()
  因此,我们想实现这个顺序也能输出结果,就要让函数five返回一个值,然后函数times通过过参数接收这个值
  然后times返回一个结果给函数seven当参数,让seven也能参与计算。
  计算一定是发生在times函数中的,five和seven只是提供数字,
  那么这个顺序应该怎么把两边的数字提供给夹在中间执行的计算函数呢?
  这个时候就可以用到闭包

  function times(a) {
    return function (b) {
     return b * a;
    };
  }

  函数times先接收一个参数a,然后返回一个匿名函数,
  这个匿名函数接收一个参数b,内部执行乘法运算
  从console.log(seven(times(five())))可以看出
  参数a就是函数five执行的结果,说明five需要返回一个可以参与计算的数值
  所以我们暂时定义函数five为这样:

  function five(){
    return 5;
  }
  
  这样times就有了a
  此时函数times拿到了参数a,也就是five返回的5,内部也没有别的运算要执行了,
  于是times将匿名函数返回给函数seven当参数

  seven就会像这样:
  seven(function(b){
    return b * 5;
  })

  所以说,我seven该怎么定义,才能把7交给你个匿名函数当b参与计算呢
  其实很简单:
  function seven(calculate){
    calculate(7);
  }
  直接在函数内部调用这个计算函数,并且把7传给它
  calculate(7)就相当于:
  function(7){ return 7 * 5;} 这么个函数被调用了 
  然后返回了一个乘法结果35
  最后,我们要在控制台输出结果,所以函数seven要把结果返回出去
  function seven(calculate){
    return calculate(7);
  }

  这样就完成了整个计算流程
  console.log(seven(times(five())))
  控制台输出结果35
  最后整合一下,一共有0-9个数,每个数都有当第一位和第二位的时候
  当第二位的时候,数字函数无参,并且返回数值
  否则返回计算函数的调用结果 function(b){return b * a;}

  function num(calculate) {
    if (arguments.length === 0) return num;//arguments是函数属性,为类数组对象,内含函数接收到的实参
    return calculate(num)
  }

  (2)我们可以用包装器包裹一下
  function numberWrapper(num) {
    return function (calculate) {
      if (arguments.length === 0) return num;
      return calculate(num)
    }
  }
  (3)然后将包装器的调用结果返回给数字,以two为例
  two: numberWrapper(2),
  two现在等同于
  two(calculate){
      if (arguments.length === 0) return 2;
      return calculate(2) 
  }
  three就是
  three(calculate){
      if (arguments.length === 0) return 3;
      return calculate(3) 
  }
  (4) let {同名变量} = 含有方法的对象
  使用解构赋值语法将需要的方法解构成变量
  这样就可以直接通过变量调用函数,而不是通过对象去调用对象方法
                        这道题的思路来自我的一个大佬朋友,觉得她的思路特别精细于是乎在这里分享给大家

代码

  function times(a) {
      return function (b) {
        return b * a;
      };
    }
    function plus(a) {
      return function (b) {
        return b + a;
      };
    }
    function minus(a) {
      return function (b) {
        return b - a;
      };
    }
    function dividedBy(a) {
      return function (b) {
        return Math.floor(b / a);
      };
    }
    // 包装器,接收一个数字,返回一个计算函数
    function numberWrapper(num) {
      return function(calculate){
        if (arguments.length === 0) return num;
        return calculate(num)
      }
    }
    let nums = {
      zero: numberWrapper(0),
      one: numberWrapper(1),
      two: numberWrapper(2),
      three: numberWrapper(3),
      four:numberWrapper(4),
      five: numberWrapper(5),
      six: numberWrapper(6),
      seven: numberWrapper(7),
      eight: numberWrapper(8),
      nine: numberWrapper(9),
    }
    let { zero,one,two,three,four,five,six,seven,eight,nine } = nums;
    console.log(seven(times(five())));
    console.log(four(plus(nine())));
    console.log(eight(minus(three())));
    console.log(six(dividedBy(two())));

4. 请订购您的订单Your order, please

描述

您的任务是对给定的字符串进行排序。字符串中的每个单词将包含一个数字。此数字是单词在结果中应具有的位置。

注意:数字可以是 1 到 9。所以 1 将是第一个单词(不是 0)。

如果输入字符串为空,则返回一个空字符串。 输入字符串中的单词将仅包含有效的连续数字。

例子

"is2 Thi1s T4est 3a"  -->  "Thi1s is2 3a T4est"
"4of Fo1r pe6ople g3ood th5e the2"  -->  "Fo1r the2 g3ood 4of th5e pe6ople"
""  -->  ""

解题思路

先将给定字符串分割成各个元素,后续用sort函数方法进行排序,对每个字符串元素中数字使用正则表达式进行查找匹配然后进行对比,重点就是配合sort函数的功能,来达到匹配每个字符串中的数字从而进行排序,最后用join()方法将所有元素拼接在一起返回

代码

function order(words){
  const arr = words.split(" ");
  arr.sort((a,b) => {
    return a.match(/\d+/)[0] > b.match(/\d+/)[0] ? 1 : -1;
  });
  return arr.join(" ");
}

5.别再啰嗦我的妖孽了!Stop gninnipS My sdroW!

描述

编写一个函数,该函数接收一个或多个单词的字符串,并返回相同的字符串,但所有五个或更多字母的单词都颠倒了(就像这个 Kata 的名字一样)。传入的字符串将仅由字母和空格组成。仅当存在多个单词时,才会包含空格。

例子:

spinWords( "Hey fellow warriors" ) => returns "Hey wollef sroirraw" 
spinWords( "This is a test") => returns "This is a test" 
spinWords( "This is another test" )=> returns "This is rehtona test"

解题思路

先将给定字符串用split()方法切割成各个字符串元素,然后用for循环对每个字符串元素进行判断,长度大于5的话,就对该字符串颠倒: 先用split()方法切割各个字符,再用reverse()方法调到顺序,最后用join()方法将各个颠倒了字符拼接起来,就做到了就字符串的颠倒。

代码

function spinWords(text){
  
    let newText = text.split(" ");
  
    for (let i = 0; i < newText.length; i++){
      if(newText[i].length >= 5){
        newText[i] = newText[i].split("").reverse().join("");
      } 
    }
    let result = newText.join(" ");
    return result;
  }