我不知道是否有这种问题的名称,更不用说解决方案了,所以我所能做的就是尽力描述它。
假设我有一个处于以下状态的数组:
[0,0,3,0]
稍后,数组中的值已更改为:
[5,0,0,0]
让我们调用旧状态 A 和新状态 C 。我们希望找到一个状态 B ,它代表两者之间的中间形式。
我真正想要的中间形式是 [0,4,0,0] ,这样所有三个阶段的状态变化都代表了改变位置和价值的动作。
简单地平均这两种状态是行不通的,因为这会产生以下中间形式: [2.5,0,1.5,0] ,这是我所追求的错误表示。< / p>
另一个例子:
A:[0,2,0,0,0,6]
C:[0,4,0,8,0,0]
中间表格应为:
B:[0,3,0,0,7,0]
部分问题是我无法定义问题。很清楚在给定输入的情况下我想要什么结果,但我似乎无法使用足够精确的语言来描述输入结果。
根据输入描述结果的正确方法是什么,以便我能更好地表达问题?
最终,是否有一种能够产生我所追求的算法?
答案 0 :(得分:0)
这适用于您的两个测试用例。
def avg(l1, l2, base=0):
ans = []
L = len(l1)
i = 0
while i < L:
e1 = l1[i]
e2 = l2[i]
if e1 != base or e2 != base:
left = i
if e1 != base:
first = l1
second = l2
else:
first = l2
second = l1
while i < L and second[i] == base:
i += 1
ans += [base] * (i - left + 1)
avg_idx = (left + i) // 2
avg_val = (first[left] + second[i]) / 2
ans[avg_idx] = avg_val
else:
ans.append(base)
i += 1
return ans
print(avg([0, 0, 3, 0], [5, 0, 0, 0])) # [0, 4.0, 0, 0]
print(avg([0, 2, 0, 0, 0, 6], [0, 4, 0, 8, 0, 0])) # [0, 3.0, 0, 0, 7.0, 0]
print(avg([2,2,3,2], [5,2,2,2], base=2) # [2, 4.0, 2, 2]
答案 1 :(得分:0)
虽然我没有&#34;明确的情况&#34; (可能的向量状态),我假设如果输入向量中的两个元素大于零,则只能在两种情况下:
a)i == j
b)i == j + 2(或通常:(i + j)%2 = 0
i:v1中元素的索引
j:v2中元素的索引
在这种情况下,此伪代码可能会产生所需的结果:
vector v1, v2;
vector v3 = [0]; --all zeros in resultant vector
pos1 = pos2 = -1; --position of elements in vectors
for (i = 0; i < size(v1); i++)
{
if (v1(i) > 0)
pos1 = i;
if (v2(i) > 0)
pos2 = i;
if (pos1 >= 0 && pos2 >= 0)
{
pos3 = pos1 + pos2;
if ((pos3 % 2) != 0)
{
--how to handle this?
--error?
}
pos3 = pos3/2;
v3(pos3) = (v1(pos1) + v2(pos2) )/ 2;
pos1 = pos2 = -1;
}
}
v3是结果向量,即具有&#34;内插&#34;值。 它应该适用于你提出的案例......我希望如此:)