翻譯:瘋狂的技術宅
原文: https://medium.freecodecamp.o...
本文首發微信公衆號:前端先鋒
歡迎關注,天天都給你推送新鮮的前端技術文章javascript
編寫算法時,排序是一個很是重要的概念。它有各類各樣的種類:冒泡排序、希爾排序、分塊塊排序,梳排序,雞尾酒排序,侏儒排序 —— 這些可不是我瞎編的!前端
這個算法題可以讓咱們一睹精彩的世界。咱們必須對數字數組進行升序排序,並找出給定數字在該數組中的位置。java
將值(第二個參數)插入到數組(第一個參數)中,並返回其在排序後的數組中的最低索引。返回的值應該是一個數字。
例如getIndexToIns([1,2,3,4], 1.5)
應該返回1
,由於1.5
大於1
(索引0),但小於2
(索引1)。
一樣,getIndexToIns([20,3,5], 19)
應該返回2
,由於數組排序後應該是[3,5,20]
,19
小於20
(索引2)且大於5
(索引1)。
function getIndexToIns(arr, num) { return num; } getIndexToIns([40, 60], 50);
本算法題原題程序員
getIndexToIns([10, 20, 30, 40, 50], 35)
應該返回一個數字 3
。getIndexToIns([10, 20, 30, 40, 50], 30)
應該返回一個數字 2
.getIndexToIns([40, 60], 50)
應該返回一個數字 1
.getIndexToIns([3, 10, 5], 3)
應該返回一個數字 0
.getIndexToIns([5, 3, 20, 3], 5)
應該返回一個數字 2
.getIndexToIns([2, 20, 10], 19)
應該返回一個數字 2
.getIndexToIns([2, 5, 10], 15)
應該返回一個數字 3
.getIndexToIns([], 1)
應該返回一個數字 0
..sort()
,. indexOf()
理解問題:有兩個輸入:一個數組和一個數字。咱們的目標是將輸入的數字在輸入數組後中排序後,再返回它的索引。
示例/測試用例:咱們不知道輸入的數組是以哪一種方式排序的,可是提供的測試用例清楚地代表,輸入的數組應該從小到大進行排序。面試
請注意,在最後一個測試用例中存在邊界問題,其中輸入數組是一個空數組。算法
數據結構:因爲咱們最終將會返回索引,所以應該堅持使用數組。segmentfault
咱們將會用一個名爲 .indexOf()
的方法:數組
.indexOf()
返回元素在數組中出現的第一個索引,若是元素根本不存在則返回 -1
。例如:微信
let food = ['pizza', 'ice cream', 'chips', 'hot dog', 'cake'] food.indexOf('chips') // returns 2 food.indexOf('spaghetti') // returns -1
咱們將使用 .concat()
而不是 .push()
。爲何呢?由於當使用 .push()
向數組添加元素時,它會返回新數組的長度。而使用 .concat()
向數組添加元素時,它會返回新數組自己。例如:數據結構
let array = [4, 10, 20, 37, 45] array.push(98) // returns 6 array.concat(98) // returns [4, 10, 20, 37, 45, 98]
算法:
num
插入 arr
。arr
進行升序排序。num
的索引。代碼:
function getIndexToIns(arr, num) { // Insert num into arr, creating a new array. let newArray = arr.concat(num) // [40, 60].concat(50) // [40, 60, 50] // Sort the new array from least to greatest. newArray.sort((a, b) => a - b) // [40, 60, 50].sort((a, b) => a - b) // [40, 50, 60] // Return the index of num which is now // in the correct place in the new array. return newArray.indexOf(num); // return [40, 50, 60].indexOf(50) // 1 } getIndexToIns([40, 60], 50);
去掉局部變量和註釋後的代碼:
function getIndexToIns(arr, num) { return arr.concat(num).sort((a, b) => a - b).indexOf(num); } getIndexToIns([40, 60], 50);
.sort()
,.findIndex()
理解問題:有兩個輸入:一個數組和一個數字。咱們的目標是將輸入的數字在輸入數組後中排序後,再返回它的索引。
示例/測試用例:咱們不知道輸入的數組是以哪一種方式排序的,可是提供的測試用例清楚地代表,輸入的數組應該從小到大進行排序。
這個解決方案須要考慮兩個邊界狀況:
0
,由於 num
將是該數組中的惟一元素,因此它在索引爲 0
的位置。num
的位置處於升序排序後的 arr
的末尾,那麼咱們須要返回 arr
的長度。數據結構:因爲咱們最終將會返回索引,所以應該堅持使用數組。
讓咱們看看.findIndex()
並瞭解它將如何幫助解決這一挑戰:
.findIndex()
返回數組中第一個知足條件的元素索引。不然它將返回 -1
,這表示沒有元素經過測試。例如:
let numbers = [3, 17, 94, 15, 20] numbers.findIndex((currentNum) => currentNum % 2 == 0) // returns 2 numbers.findIndex((currentNum) => currentNum > 100) // returns -1
這對咱們頗有用,由於咱們能夠用 .findIndex()
將輸入 num
與輸入 arr
中的每一個數字進行比較,並找出它從最小到最大的順序。
算法:
arr
是一個空數組,則返回 0
。num
處於排序後數組的末尾,則返回 arr
的長度。num
。代碼:
function getIndexToIns(arr, num) { // Sort arr from least to greatest. let sortedArray = arr.sort((a, b) => a - b) // [40, 60].sort((a, b) => a - b) // [40, 60] // Compare num to each number in sortedArray // and find the index where num is less than or equal to // a number in sortedArray. let index = sortedArray.findIndex((currentNum) => num <= currentNum) // [40, 60].findIndex(40 => 50 <= 40) --> falsy // [40, 60].findIndex(60 => 50 <= 60) --> truthy // returns 1 because num would fit like so [40, 50, 60] // Return the correct index of num. // If num belongs at the end of sortedArray or if arr is empty // return the length of arr. return index === -1 ? arr.length : index } getIndexToIns([40, 60], 50);
去掉局部變量和註釋的代碼:
function getIndexToIns(arr, num) { let index = arr.sort((a, b) => a - b).findIndex((currentNum) => num <= currentNum) return index === -1 ? arr.length : index } getIndexToIns([40, 60], 50);
若是你有其餘解決方案或建議,請在評論中分享!