單行程式碼演算法解答

weixin_33830216發表於2018-11-12
5616361-4405b6d7c5dab6cd.jpg

在實際工作當中,我們常常需要對資料進行處理,比如簡單的陣列元素相加,字串的倒序排列等等。如果使用C語言來解答此類問題,我們需要用到一些底層的演算法邏輯,使用基礎的for迴圈和if判斷等來解決。但是,在JS這門語言中,它本身就給我們提供了很多處理字串和陣列等資料結構的函式方法,這給我們解決此類問題帶來了很多便利,下面我就以幾個簡單的例子來為大家展示如何使用單行程式碼解答演算法

1. 獲取最大值和最小值

編寫函式highAndLow(), 獲取數字組成的字串中的最大值和最小值,用空格隔開並返回,要求實現以下結果:

highAndLow("1 2 3 4 5"); // "5 1"
highAndLow("1 2 -3 4 5"); // "5 -3"
highAndLow("1 9 3 4 -5"); // "9 -5"

一行程式碼解答:

let highAndLow = (numbers) => `${Math.max(...numbers.split(' '))} ${Math.min(...numbers.split(' '))}`;

演算法解析:

numbers.split(' ') —— 用於將字串拆分為陣列
...numbers.split(' ') —— 【ES6語法】擴充套件運算子(...),用於將陣列展開,展開的每一項作為引數傳入Math.max()中
Math.max()Math.min() —— 分別用於求解陣列項的最大值和最小值
${} —— 【ES6語法】模板字串,用於在字串(用反引號`引用)中寫入變數

2. 單詞首字母大寫

編寫函式toJadenCase(), 將英語句子中每個單詞首字母改為大寫,要求實現以下結果:

var str = "how can mirrors be real if our eyes aren't real";  
console.log(str.toJadenCase());   // "How Can Mirrors Be Real If Our Eyes Aren't Real"

一行程式碼解答:

String.prototype.toJadenCase = function(){ return this.replace(/(^|\s)[a-z]/g, x => x.toUpperCase()) };

演算法解析:

/(^|\s)[a-z]/g —— 正規表示式,其中 ^ 表示字串起始位置,\s 表示空格,[a-z] 表示單個小寫字母,g 表示全域性匹配
toUpperCase() —— 用於將字串轉換為大寫
replace() —— 用於字串的替換,更多用法可參見 → 簡述test()、match()、replace()和search()的用法

3. 駝峰式命名轉換

編寫函式toCamelCase(), 實現駝峰式命名轉換,要求實現以下結果:

toCamelCase("")   // ""
toCamelCase("the-stealth-warrior")   // "theStealthWarrior"
toCamelCase("The_Stealth_Warrior")   // "TheStealthWarrior"

一行程式碼解答:

let toCamelCase = str => str.replace(/(\-|_)([a-z]|[A-Z])/g, w => w.toUpperCase().slice(1));

演算法解析:

/(-|_)([a-z]|[A-Z])/g —— 正規表示式,其中 \- 表示字元 -(加反斜槓是用來轉義,因為短橫槓 - 為正則元字元),[a-z] 表示單個小寫字母,[A-Z] 表示單個大寫寫字母,g 表示全域性匹配
slice() —— 用於字串的裁剪,具體用法詳見 → JavaScript字串“三劍客”

4. 句子中最短的單詞長度

編寫函式findShort(), 獲取英文句子中最短單詞的長度,要求實現以下結果:

findShort("bitcoin take over the world maybe who knows perhaps")   // 3
findShort("turns out random test cases are easier than writing out basic ones")  // 3

一行程式碼解答:

let findShort = s => Math.min(...s.split(" ").map(s => s.length));

演算法解析:

map() —— 用於遍歷處理陣列元素,這裡是將陣列元素全部轉換為陣列元素字串長度

5. 求平均數

編寫函式getAverage(), 求解陣列中所有項的平均數,最終將該平均數向下取整作為函式返回值,要求實現以下結果:

getAverage([2,2,2,2])  // 2
getAverage([1,2,3,4,5,])  // 3
getAverage([1,1,1,1,1,1,1,2])   // 1

一行程式碼解答:

let getAverage = marks => Math.floor(marks.reduce((prev,cur) => prev + cur) / marks.length);

演算法解析:

reduce() —— 用於歸併處理陣列元素,這裡是將所有陣列元素相加,具體用法詳見 → 淺談JS中 reduce() 的用法
Math.floor() —— 用於數字向下取整


-- End --

更多有趣演算法解答,歡迎關注微信公眾號:前端微站

相關文章