前端計劃——Codewars的一些JavaScript題集

關於Codewars:這是一個用於編程練習的網站,支持多種編程語言。網站首次註冊須要完成兩道題目,以後進入系統,相似於打怪升級。經過完成題目來實現段位的提高,而題目的難度也會隨之增加。
傳送到戰場git

下面將列出一些題目,能夠做爲對於JavaScript的練習。正則表達式

題目列表

每道題目都有多種解法,這裏列出的是得票最多的答案。代碼簡潔高效。編程

一、降序排列整數


題目描述:輸入一個非負整數n,輸出它的降序排列以後的整數。數組

例如輸入:145263,輸出:654321編程語言

解題思路:將n轉換爲字符串,分割,排序,逆序以後從新鏈接爲字符串,再轉爲數字。
function descendingOrder(n){
  return parseInt(String(n).split('').sort().reverse().join(''))
}

二、三角形數(Triangular numbers)


題目描述:輸入一個數字n,返回n對應的三角形數。
當n爲負數時,返回0。函數

這裏首先要解釋一下什麼叫三角形數:也就是1+2+3+...+n求和,之因此叫三角形數,是由於用*表示每行的數量,由下到上由n到1正好組成一個三角形。網站

解題思路:使用求和公式
function triangular( n ) {
  return (n > 0) ? ((n * n) + n) / 2 : 0;
}

三、求數根(digital root)


題目描述:給定一個數字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


問題描述:把輸入的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];
}
相關文章
相關標籤/搜索