本文題目來自網站codesignal,它是個可依自己選取的程式語言進行測驗,測驗難易程度會逐題增加,可透過解題來獲得分數以及徽章,相當有趣味性。在sumbit後可在左欄看到票選最高的解法,這些解法來自不同語言,當然你可以在上面篩選自己撰寫的程式語言。沒有所謂的最好的解法,只有最適合的方式。 題目
Ratiorg got statues of different sizes as a present from CodeMaster for his birthday, each statue having an non-negative integer size. Since he likes to make things perfect, he wants to arrange them from smallest to largest so that each statue will be bigger than the previous one exactly by 1. He may need some additional statues to be able to accomplish that. Help him figure out the minimum number of additional statues needed.
範例
For statues = [6, 2, 3, 8], the output should be
solution(statues) = 3.
Ratiorg needs statues of sizes 4, 5 and 7.
解題方式
function solution(statues) {
let num = 0;
const seq = statues.sort(function(a,b) {
return a-b
})
for(let i =0; i < seq.length; i++){
if(seq[i]-seq[i-1] >= 2){
num+=seq[i]-seq[i-1] -1
}}
return num
}
想法
首先宣告解題答案為num,並將重新用sort()方程式依小到大排序而產生的陣列宣告為seq。並讓seq陣列透過跑for迴圈,套入if條件,如果選取值減掉前一個值大於等於2的話,就讓num等於選取值減掉前一個值所產生的差異值,在減以1就等於中間的差異值個數,並讓這些差異值個數進行加總,即是答案。
這邊要介紹一下,一開始所使用的sort()方法。
它是個可將陣列重新依照大小進行排列函式,但有幾個使用要點需要注意,它只取每個字串的第一個字進行比較,無論是阿拉伯數字或是英文字母皆是如此。假設你的陣列字串都是單位數,例如arr=[2,6,7,3,4]
那使用該函式後,arr.sort()=[2,3,4,6,7]
有順利的依值數大小進行順利排列
但如果你的陣列字串包含雙位數者,例如arr=[26,13,5,6,49]
那使用該函式後,arr.sort()=[13,26,49,5,6]
這和我們內心想地的大小排序不同
如果雙位數者要進行大小排序,需要使用以下兩個方式:
升冪排序
numbers.sort(function(a, b) {
return a - b; });
降冪排序
numbers.sort(function(a, b) {
return b - a; });