Codewars之JS题解

这一篇文章主要是写一些我在Codewars上写到的js题目。


2019.5.9

Disemvowel Trolls

题目

将一行字符串中的元音字符删去,并返回修改后的字符串。

题解

直接使用字符串自带的函数replace
str.replace(x,y)表示将与正则表达式x匹配的子串替换成y字符串
我们所需要的正则表达式为/[aeiou]/gi
/g表示执行全局匹配
/i表示对大小写不敏感
因为是删去,所以我们把匹配到的子串替换成空字符,即’’

代码
1
2
3
function disemvowel(str) {
return str.replace(/[aeiou]/gi, '');
}

List Filtering

题目

给定一个只含有数字类型和字符串类型元素的数组对象,过滤其中的字符串,并输出。

题解

数组对象有一个函数是filter(),功能为创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的元素。
那么接下来就是判断一个元素是否为数字类型。通过typeof我们可以得到一个元素的数据类型,如果等于’number’那么就是数字类型。

代码
1
2
3
4
5
6
7
function check(e){
return typeof e == "number";
}
function filter_list(l) {
// Return a new array with the strings filtered out
return l.filter(check);
}

2019.5.12

Number of People in the Bus

题目

给定一个数组,表示n个车站。数组中的每个元素包含两个整型,分别表示每一个车站的上车人数和下车人数。求到最后一站时车上还剩下的人数。

题解

代码很好写,但是js代码要用js特色的代码。
数组中自带的reduce函数,功能为从左到右将元素通过括号里的函数累加。
(a,b)=>(a+b)是函数的另一种表现形式,等价于

1
2
3
function (a,b){
return a+b;
}

代码
1
2
3
4
var number = function(busStops){
// Good Luck!
return busStops.reduce((ans,[add,dec])=>ans+add-dec,0);//0表示初始值
}

2019.5.14

Your order, please

题目

给定一个字符串,字符串中的每一个单词都包含着一个单独的数字,位置不定。
数字的范围为1-9,请按照数字从小到大对单词进行排序。
输出排序后的字符串。

题解

这题应该是我第一次用JS语言的风格单独写出来的题。之前的题目虽然也是自己解决的,但代码写出来就跟用C\C++写出来的一样。
以下为使用函数的解析:
str.split(separtor,limit):将字符串转换成数组。separtor是指定分割成元素的字符或正则表达式。
array.sort(function):对数组中的元素进行排序,默认排序顺序是按照字母升序。function是用来指定排序顺序的函数。
str.match(regexp):在字符串中检索一个或者多个与括号内正则表达式匹配的值。
array.join(separator):将数组中的所有元素转换成一个字符串,separator为元素之间的分隔符,此处用空格。

代码
1
2
3
function order(words){
return words.split(" ").sort((word1,word2)=>word1.match(/[1-9]/)>word2.match(/[1-9]/)).join(" ");
}

Where my anagrams at?

题目

定义两个字符串等价,当且仅当它们拥有的每种字符的个数都相等。
问在给定的字符串数组中有多少字符串与给定的字符串word等价。

题解

这题不难,所需函数上文都有。

代码
1
2
3
4
function anagrams(word, words) {
word = word.split('').sort().join('');
return words.filter(a => a.split('').sort('').join('') == word);
}

5.20

Calculating with Functions

题目

使用函数计算结果。
输入包括两个数字函数和一个符号函数,如one(plus(two()));形式,即要求计算1+1的结果。
数字函数代表函数名对应的数字。
符号函数代表函数名对应的符号。
除法向下取整。

题解

因为这道题目我升到了5kyu
这道题其实并不难,用寻常的方法也是可以写的。
我再看了别人代码后修改了自己的代码。
其实主要的盲点就是函数可以直接返回一个函数。
代码不难,模拟一下即可。

代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function zero(Func) {return Func?Func(0):0;}
function one(Func) {return Func?Func(1):1;}
function two(Func) {return Func?Func(2):2;}
function three(Func) {return Func?Func(3):3;}
function four(Func) {return Func?Func(4):4;}
function five(Func) {return Func?Func(5):5;}
function six(Func) {return Func?Func(6):6;}
function seven(Func) {return Func?Func(7):7;}
function eight(Func) {return Func?Func(8):8;}
function nine(Func) {return Func?Func(9):9;}

function plus(b) {return (a)=>a+b;}
function minus(b) {return (a)=>a-b;}
function times(b) {return (a)=>a*b;}
function dividedBy(b) {return (a)=>Math.floor(a/b);}

5.21

Simple Pig Latin

题目

将给定字符串中的每个单词的第一个字母移到末尾,并在末尾加上’ay’。忽略标识符

1
2
pigIt('Pig latin is cool'); // igPay atinlay siay oolcay
pigIt('Hello world !'); // elloHay orldway !

题解

感觉这题还是主要考验

代码
1
2
3
function pigIt(str){
return str.replace(/\b(\w)(\w*)\b/gi,"$2$1ay");
}