【筆試題】codewars:最小可能的總和
阿新 • • 發佈:2018-11-19
描述
給定一個正整數的陣列X,它的元素將通過對它們執行以下操作來轉換所需的次數:
if X[i] > X[j] then X[i] = X[i] - X[j]
如果無法進行更多轉換,則返回其總和(“最小可能總和”)。
例如,輸入X = [6,9,21]的元素的連續變換詳述如下:
X_1 = [6, 9, 12] # -> X_1[2] = X[2] - X[1] = 21 - 9 X_2 = [6, 9, 6] # -> X_2[2] = X_1[2] - X_1[0] = 12 - 6 X_3 = [6, 3, 6] # -> X_3[1] = X_2[1] - X_2[0] = 9 - 6 X_4 = [6, 3, 3] # -> X_4[2] = X_3[2] - X_3[1] = 6 - 3 X_5 = [3, 3, 3] # -> X_5[1] = X_4[0] - X_4[1] = 6 - 3
返回的輸出是最終轉換的總和(這裡是9)。
例:
solution([6, 9, 21]) #-> 9
解決步驟:
[6, 9, 12] #-> X[2] = 21 - 9
[6, 9, 6] #-> X[2] = 12 - 6
[6, 3, 6] #-> X[1] = 9 - 6
[6, 3, 3] #-> X[2] = 6 - 3
[3, 3, 3] #-> X[1] = 6 - 3
補充說明:
有一些效能測試包括非常大的數字和大小至少為30000的陣列。請編寫一個有效的演算法來防止超時。
解答:
function solution(numbers) { let length = numbers.length; let temp = numbers[0]; numbers.sort(function(a,b){ return a-b; }) for(let i = 0;i<length-1;i++){ let max = numbers[i+1]; let min = temp; while(max%min !=0){ temp = max%min; max = min; min = temp; } } return temp*length }