您將獲得一個起始編號和結束編號以及允許的最大輸出元素數。您將如何創建一個分布盡可能均勻的輸出陣列,同時仍然包括輸出中的第一個和最后一個點?
函式簽名
function generatePoints(startingNumber, endingNumber, maxPoints) {}
功能所需的輸出
generatePoints(0, 8, 5) // [0, 2, 4, 6, 8]
這是我到目前為止嘗試過的
function generatePoints(startingNumber, endingNumber, maxPoints) {
const interval = Math.round((endingNumber - startingNumber) / maxPoints)
let count = 0
let counter = 0
let points = []
while(count < maxPoints - 1) {
points.push(counter)
counter =interval
count
}
points.push(endingNumber)
return points
}
從技術上講,這為簡單的情況創建了正確的輸出,但是由于我提前停止了一次迭代然后添加了最后一點,因此在與大多數其他邊緣情況相比時就不足了。我認為更好的方法(創建更好的分布)是從陣列的中心向外構建,而不是從陣列的開頭構建,然后提前停止一個元素并附加 endNumber。
uj5u.com熱心網友回復:
請注意:
0 2 4 6 8
----- ----- ----- -----
A B C D
將我們的范圍分成包括端點在內的 5 個點的區間,我們只有四個區間。它總是比點數少一。我們可以將我們的范圍平均劃分為這些較小的范圍,只需不斷增加一個區間的寬度,即(endingNumber - startingNumber) / (maxPoints - 1). 我們可以這樣做:
const generatePoints = (startingNumber, endingNumber, maxPoints) => Array .from (
{length: maxPoints},
(_, i) => startingNumber i * (endingNumber - startingNumber) / (maxPoints - 1)
)
console .log (generatePoints (0, 8, 5))
我們只是構建一個正確長度的陣列,使用 index 引數來計算我們正在使用的較小間隔的數量。
我們在這里不做錯誤檢查,如果maxPoints只是1,我們可能會遇到問題。但這很容易處理你喜歡的方式。
但這里有一個問題。為什么呼叫引數maxPoints而不是points?如果允許的點數是可變的,我認為我們需要進一步的要求。
uj5u.com熱心網友回復:
不要Math.round(interval)。而是Math.round(counter)在最后一刻。
原因是,如果您添加了k間隔,那么您將要進行的操作的錯誤可能高達0.5*k. 但如果你在最后一分鐘四舍五入,誤差永遠不會超過0.5.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/478400.html
標籤:javascript 数组 算法 排序 逻辑
上一篇:梯形上的雙線性插值
