关于Codewars:这是一个用于编程练习的网站,支持多种编程语言。网站首次注册须要完成两道题目,以后进入系统,相似于打怪升级。经过完成题目来实现段位的提高,而题目的难度也会随之增加。
传送到战场git
下面将列出一些题目,能够做为对于JavaScript的练习。正则表达式
每道题目都有多种解法,这里列出的是得票最多的答案。代码简洁高效。编程
题目描述:输入一个非负整数n,输出它的降序排列以后的整数。数组
例如输入:145263,输出:654321编程语言
解题思路:将n转换为字符串,分割,排序,逆序以后从新链接为字符串,再转为数字。
function descendingOrder(n){ return parseInt(String(n).split('').sort().reverse().join('')) }
题目描述:输入一个数字n,返回n对应的三角形数。
当n为负数时,返回0。函数
这里首先要解释一下什么叫三角形数:也就是1+2+3+...+n求和,之因此叫三角形数,是由于用*表示每行的数量,由下到上由n到1正好组成一个三角形。网站
解题思路:使用求和公式
function triangular( n ) { return (n > 0) ? ((n * n) + n) / 2 : 0; }
题目描述:给定一个数字n,求它的数根。code
数根:求一个数的各位数字以后,若这个数为个位数则中止。不然继续。
例如:digital_root(942)
=> 9 + 4 + 2
=> 15 ...
=> 1 + 5
=> 6排序
解题思路:正常状况下不少人可能靠循环迭代,然而其实这个是有数学公式的。。。
function digital_root(n) { return (n - 1) % 9 + 1; }
题目描述:输入一个字符串。对其中字母数量大于5的单词进行反转,其他单词不变。而后输出新字符串。ip
例如:spinWords( "Hey fellow warriors" ) => returns "Hey wollef sroirraw"
解题思路:先经过空格分割字符串为数组,而后判断单词长度,反转顺序后从新链接。或者使用replace方法替换部分单词。
//方法1:传统方法 function spinWords(words){ return words.split(' ').map(function (word) { return (word.length > 4) ? word.split('').reverse().join('') : word; }).join(' '); }
//方法2:使用正则 function spinWords(string){ return string.replace(/\w{5,}/g, function(w) { return w.split('').reverse().join('') }) }
问题描述:编程中咱们经常使用各类括号,可是括号必须互相对应。编写一个函数来实现检验给定的括号是否互相对应。
好比[{()}]是对的,而{(})是错误的。
解题思路:使用正则表达式
function groupCheck(s){ var r = /\{\}|\[\]|\(\)/; while(r.test(s)) s = s.replace(r, ''); return !s.length; }
问题描述:把输入的IPv4地址转换为Int32格式
好比ipToInt32("128.32.10.1") => 2149583361
解题思路:使用位移运算符
//方法1 function ipToInt32(ip){ return ip.split(".").reduce(function(int,v){ return int*256 + +v } ) }
//方法2 function ipToInt32(ip){ ip = ip.split('.'); return ((ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + (ip[3] << 0))>>>0; }
问题描述:电影院票价为$25,而观众手中的美圆面值有$100,50,25。给定一个数组,表明观众的顺序和手中的面额,来判断是否可以找零钱。
好比
tickets([25, 25, 50]) // => YES
tickets([25, 100]) // => No 后面的面值太大,没有足够的零钱找给观众。
解题思路:为每一个面值的美圆设定初始数量,而后开始对每一个数组值遍历,根据不一样面值设定不一样规则。最后看一下25面值的数量,若是为负数,就是不够找。
function tickets(peopleInLine) { var bills = [0, 0, 0] for (var i = 0; i < peopleInLine.length; i++) { switch (peopleInLine[i]) { case 25: bills[0]++ break case 50: bills[0]-- bills[1]++ break case 100: bills[1] ? bills[1]-- : bills[0] -= 2 bills[0]-- break } if (bills[0] < 0) { return 'NO' } } return 'YES' }
问题描述:对给定的字符串进行处理,把每一个单词的第一个字母移到最后,而后加上ay。
例如:pigIt('Pig latin is cool'); // igPay atinlay siay oolcay
解题思路:对字符串进行slice函数处理。或者使用正则
//方法1:使用slice函数 function pigIt(str){ return str.split(' ').map(function(el){ return el.slice(1) + el.slice(0,1) + 'ay'; }).join(' '); }
//方法2:使用正则 function pigIt(str){ return str.replace(/(\w)(\w*)(\s|$)/g, "\$2\$1ay\$3") }
问题描述:输入一个数字表明一段距离,而后返回不一样的单位值。好比m/km/Mm等
例如:
输入meters(5),返回"5m"
输入meters(51500),返回"51.5km"
解题思路:设定一个count,对应将单位放在数组里面,经过循环除以1000来判断最终单位。
function meters(x) { var count = 0; var DW = ["m","km","Mm","Gm","Tm","Pm","Em","Zm","Ym"]; while(x>=1000){ x /= 1000; count++; } return x+DW[count]; }