個人我的網站:拓跋的前端客棧~瞭解一哈。這裏是原文地址,若是您發現我文章中存在錯誤,請盡情向我吐槽,你們一塊兒學習一塊兒進步φ(>ω<*)javascript
若是您甘於平凡,寫代碼對您來講能夠就是Ctrl+C和Ctrl+V;若是您充滿創造力,寫代碼也能夠成爲一門藝術。咱們在平時總會遇到一些堪稱優雅靈性的代碼片斷,在這裏,僅以我之見,列舉出我所見到的那一部分。前端
下面爲了閱讀方便,我會把代碼的題目和莽夫解法放在一塊兒,優雅靈性的解法放在最下面,但願能對您形成必定的衝擊,看官們能夠本身嘗試一下,題目並不難。java
固然,通往羅馬的大路有千千萬,可能您的解法更爲優秀。若是這樣,但願您能在評論區展現出來,讓更多人看見~git
注:如下全部題目均來自codewars面試
Create Phone Number數組
題目:編寫一個函數,它接受一個由10個整數組成的數組(0到9之間的數組),該函數以形似(123) 456-7890的電話號碼的形式返回這些數字的字符串。app
Example:函數
createPhoneNumber([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) // => returns "(123) 456-7890"1111
複製代碼
莽夫解法:學習
const createPhoneNumber = n => "(" + n[0] + n[1] + n[2] + ") " + n[3] + n[4] + n[5] + "-" + n[6] + n[7] + n[8] + n[9]
複製代碼
Find the odd int網站
題目:給定一個數組,找到出現奇數次的數字。
PS:將始終只有一個整數出現奇數次。
Example:
findOdd([1,1,2,-2,5,2,4,4,-1,-2,5]); // => returns -1
複製代碼
莽夫解法:
function findOdd(A) {
let count = 0;
do {
let i = A.splice(count,1,'p')[0];
if (i !== 'p'){
let result = [i];
A.forEach(function (e, index) {
if (e === i){
i === result[0] ? result.pop(): result.push(i);
A.splice(index, 1, 'p');
}
});
if (result.length > 0){
return result[0]
}
}
count ++;
} while (A.length > count);
}
複製代碼
Who likes it?
題目:您可能知道Facebook或者其餘網站的「喜歡」系統。人們能夠「喜歡」博客文章,圖片或其餘項目。咱們想要建立一份顯示在這樣項目旁邊的文本。
實現一個函數,它的輸入是數組,其中包含喜歡該項目的人的姓名。返回值是以下格式的文本:
likes [] // must be "no one likes this"
likes ["Peter"] // must be "Peter likes this"
likes ["Jacob", "Alex"] // must be "Jacob and Alex like this"
likes ["Max", "John", "Mark"] // must be "Max, John and Mark like this"
likes ["Alex", "Jacob", "Mark", "Max"] // must be "Alex, Jacob and 2 others like this"
複製代碼
莽夫解法:
const likes = names => {
switch (names.length) {
case 0: return 'no one likes this'
case 1: return names[0] + ' likes this'
case 2: return names[0] + ' and ' + names[1] + ' like this'
case 3: return names[0] + ', ' + names[1] + ' and ' + names[2] + ' like this'
default: return names[0] + ', ' + names[1] + ' and ' + (names.length - 2) + ' others like this'
}
}
複製代碼
Shortest Word
題目:給定一串單詞,返回最短單詞的長度。
字符串永遠不會爲空,您不須要考慮不一樣的數據類型。
Example:
findShort("bitcoin take over the world maybe who knows perhaps") // returns 3,由於最短單詞是the和who,長度爲3
複製代碼
莽夫解法:
// 其實也不是特別莽
const findShort = s => s.split(' ').map(w => w.length).sort((a,b) => a-b)[0];
複製代碼
Sum of Digits / Digital Root
題目:建立一個計算digital root的函數。
digital root是數字中各位數字的遞歸總和。給定n,取n各位數字之和。若是該值是兩位數或者更多,則繼續以這種方式遞歸,直到產生一位數字,這個數字就是digital root。這隻適用於天然數。
Example:
digital_root(16)
=> 1 + 6
=> 7
digital_root(942)
=> 9 + 4 + 2
=> 15 ...
=> 1 + 5
=> 6
digital_root(132189)
=> 1 + 3 + 2 + 1 + 8 + 9
=> 24 ...
=> 2 + 4
=> 6
digital_root(493193)
=> 4 + 9 + 3 + 1 + 9 + 3
=> 29 ...
=> 2 + 9
=> 11 ...
=> 1 + 1
=> 2
複製代碼
莽夫解法:
function digital_root(n) {
let num = n;
if (num < 10){
return num
}else {
return arguments.callee((num+'').split('').reduce(function (a,b) {
return parseInt(a) + parseInt(b)
}))
}
}
複製代碼
Create Phone Number
function createPhoneNumber(numbers){
var format = "(xxx) xxx-xxxx";
for(var i = 0; i < numbers.length; i++){
format = format.replace('x', numbers[i]);
}
return format;
}
複製代碼
使用一個format的模版,經過循環replace全部format裏的x位,優雅且可讀性強,讓人眼前一亮。
Find the odd int
const findOdd = (xs) => xs.reduce((a, b) => a ^ b);
複製代碼
我猜起碼70%的人看到這個解法會一愣。回想一下,本身多久沒有用過位運算了?本題使用reduce()和按位異或操做,至關於全部出現偶數次的數按位異或後均爲0,而後出現奇數次的數字與0按位異或獲得本身自己,從而得解。
Who likes it?
function likes (names) {
var templates = [
'no one likes this',
'{name} likes this',
'{name} and {name} like this',
'{name}, {name} and {name} like this',
'{name}, {name} and {n} others like this'
];
var idx = Math.min(names.length, 4);
return templates[idx].replace(/{name}|{n}/g, function (val) {
return val === '{name}' ? names.shift() : names.length;
});
}
複製代碼
這個不用解釋了,使用模版字符串,可別傻傻的手動拼寫了。
Shortest Word
function findShort(s){
return Math.min.apply(null, s.split(' ').map(w => w.length));
}
複製代碼
面試中常常可能會遇到問apply和call的區別之類的題目,可是實際上在工做中有多少人用它們寫過代碼呢?
Sum of Digits / Digital Root
function digital_root(n) {
return (n - 1) % 9 + 1;
}
複製代碼
這個解法堪稱神來之筆。有些人可能看不懂,它利用了咱們小學時期學的一條定理,「全部位相加之和是9的倍數的數字能被9整除」。這個您可能沒印象了,可是「全部位相加之和是3的倍數的數字能被3整除」這個您必定知道吧,這是一樣的道理。至於爲何(n-1)整除9之後再加1,是爲了防止9的倍數自己求出0的解來。
以上五段代碼,分別經過replace、位運算、模版字符串、apply甚至是「全部位相加之和是9的倍數的數字能被9整除」這種定理都能拿來解題,實在是使人歎爲觀止。
有些操做是神來之筆,有些操做是能夠學習的。咱們要作的就是把能學習到的學習到,下次本身能用上,這就夠了。