【发布时间】:2017-01-11 17:05:06
【问题描述】:
给定一个这样的数字数组:
[0, 99, 299, 498, 901]
我可以使用什么算法将该数组调整为它们之间距离大致相等的数组。或者换一种说法,用近似最大公倍数重新采样。所以对于上面的例子,最大公约数是大约 100,因此结果是:
[0, 99, 200, 299, 400, 498, 600, 700, 800, 901]
使用原始值会很好,并且可以设置错误栏(以上解决方案将错误设置为 2),但也会对这个结果感到满意:
[0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
2017 年 1 月 12 日更新
根据 Redu 的回答,这是他的代码的 Swift 版本:
var arr: [Int] = [0, 99, 299, 498, 901]
var diffs = [Int]()
var minGap: Int = 0
for x in 0..<arr.count-1 {
let gap = arr[x+1] - arr[x]
diffs.append(gap)
if minGap == 0 || minGap > gap {
minGap = gap
}
}
var resamples = [Int]()
for item in arr {
if let lastSample = resamples.last {
let n = Int((Float(item - lastSample) / Float(minGap)).rounded())
let g = (item - lastSample) / n
var inserts = [Int]()
for x in 0..<n-1 {
let newSample = lastSample + ((x+1) * g)
inserts.append(newSample)
}
resamples.append(item)
resamples.append(contentsOf: inserts)
} else {
resamples.append(item)
}
}
【问题讨论】:
-
大概你希望结果被四舍五入。即 100、200、300 而不是 99、198、297。
-
嗯,我想我可以四舍五入到首选的错误级别。所以如果我四舍五入到最接近的 10,最小的 GCD 值将是 10。