2017-02-21 64 views
2

我不知道是否有这种问题的名称,更不用说解决方案,所以我所能做的就是尽我所能地描述它。在两个数组之间进行插值并更改值

假设我有在以下的状态的数组:

[0,0,3,0]

后来数组中的值已更改为:

[5 ,0,0,0]

让我们把旧的国家一个和新的状态ç。我们想要找到代表两者之间的中间形式的状态B

我真正想要的中间形式是[0,4,0,0],这样状态在所有三个阶段中的变化代表着正在改变位置和价值的东西的运动。

简单地平均这两个状态不起作用,因为这会产生以下中间形式:[2.5,0,1.5,0],这是我后来发生的错误表示。

又如:

甲:[0,2,0,0,0,6]

C:[0,4,0,8,0,0]

中间形式应该是:

B:[0,3,0,0,7,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] 
+0

这适用于未改变的值全部为0,如我的例子,但我不认为这将工作时,他们是别的东西。例如[2,2,3,2]和[5,2,2,2]应该产生[2,4,2,2] ...我想知道这是否可以通过改变if if e1!= 0来解决,或者e2!= 0'到'if e1!= e2'?现在用我选择的语言试试这个...... – Joey

+0

看到我更新的答案。一般来说,我看不出没有指定它的“基础”。毕竟,[2,2,3,2]和[5,2,2,2]可以是一个数组,其中2在索引0处变为5,2在索引1处变为2等等。 – BallpointBen

+0

我明白了。那么我猜想那里存在着固有的歧义。我想我可以通过检查两个输入之间最常见的值来预先计算一个“基数”。当然,在不存在共同值的情况下,这不起作用,例如, [1,2,3]和[5,6,7] ==> [3,4,5] – Joey

0

虽然我没有“认清形势”(可能的矢量状态),我会假设,如果在输入向量两个元素是大于零,也可以是只在两种情况下:

一)1 ==Ĵ
b)本人== J + 2(或一般为:(I + J)%2 = 0

I:在v2中的元素的索引:在V1
Ĵ元素的索引

在这种情况下,这个伪码可能是g期望的结果:

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是结果向量,即具有“内插”值的结果向量。 它应该适用于你已经提交的案例...我希望如此:)