關於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]; }