数组示例:
[
1, 2, 3, 10, 11, 12, 13, 14, 20, 21, 22, 30
]我需要将它分成三个部分,并使用接近的值
[1, 2, 3]
[10, 11, 12, 13, 14]
[20, 21, 22, 30]数组可以不同,但逻辑是相同的。有没有人可以提出一些方法(数学模型、理论、分布等)来做这件事?

发布于 2020-10-09 22:08:21
术语“使用封闭值拆分数组”是不明确的。
您可以检查两个连续值之间的差值是否在特定范围内。如果差值在指定范围内,则可以将当前值添加到当前子列表中。否则,您需要添加到下一个列表中:
prev = 0
cnt = 1
for elm in A:
if elm - prev not in range(0, 5):
cnt += 1
add_to_sub(cnt, elm)
prev = elmcnt变量用于确定我们应该添加哪个子列表的值。对于这个问题,我将范围设置在0-5之间。这意味着如果差值大于或等于5,则将当前值添加到下一个子列表。
代码:
A = [1, 2, 3, 10, 11, 12, 13, 14, 20, 21, 22, 30]
sub1 = []
sub2 = []
sub3 = []
prev = 0
cnt = 1
def add_to_sub(count, element):
if count == 1:
sub1.append(element)
elif count == 2:
sub2.append(element)
else:
sub3.append(element)
for elm in A:
if elm - prev not in range(0, 5):
cnt += 1
add_to_sub(cnt, elm)
prev = elm
print(sub1)
print(sub2)
print(sub3)结果:
[1, 2, 3]
[10, 11, 12, 13, 14]
[20, 21, 22, 30]发布于 2020-10-09 23:56:34
由于源数组中的所有值都已经排序,这使得它非常容易。
在您的示例中,我会说有3种解决方案。
solution 1: [1, 2, 3]
solution 2: [10, 11, 12, 13, 14]
solution 3: [20, 21, 22, 30]每个解决方案都是一个数组。我们将使用另一个数组来包含所有这些解决方案。除非源数组为空,否则至少有一个包含1个值的解决方案。
从源代码中获取第一个值并开始创建解决方案1。现在循环遍历源代码中的剩余值。如果下一个值与当前解决方案中最近添加的值连续,则将其添加到该解决方案集中。如果没有,则开始创建新的解决方案。
source = [1, 2, 3, 10, 11, 12, 13, 14, 20, 21, 22, 30];
solutions = new Array(1);
index = 0;
solutions[index] = new Array();
solutions[index].push(source[0]);
j = 0;
for (i = 1; i < source.length; i++){
if (solutions[index][j]+1 == source[i]){
solutions[index].push(source[i]);
j++
}else{
solutions.push(new Array());
index++;
solutions[index].push(source[i]);
j = 0;
}
}
console.log(solutions);https://stackoverflow.com/questions/64281409
复制相似问题