2017-07-29 20 views
-1

我試着對Codility進行演示測試,以找到數組的均衡指數(es)。我不確定測試是要找到數組的均衡指數還是什麼。我一派四周,發現下面的例子:陣列的均衡指數如何工作?

序列的平衡指數是這樣的索引的元素的在較低索引的總和等於在較高的索引的元素的總和。例如,在一個序列A:

A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0

3是一種平衡指數,這是因爲:

A[0] + A[1] + A[2] = A[4] + A[5] +A[6]

6也是平衡指數,這是因爲:

A[0] + A[1] + A[2] + A[3] + A[4] + A[5] = 0

基於這個信息我看到測試數組包含7個元素。它看起來像中間元素A[3]=2被忽略。是因爲它在前3個元素和後3個元素之間?在這個例子中,6的均衡指數是如何得出的?

這裏是用來計算這種方法:

int equi(int arr[], int n) { 
    if (n==0) return -1; 
    long long sum = 0; 
    int i; 
    for(i=0;i<n;i++) sum+=(long long) arr[i]; 

    long long sum_left = 0;  
    for(i=0;i<n;i++) { 
     long long sum_right = sum - sum_left - (long long) arr[i]; 
     if (sum_left == sum_right) return i; 
     sum_left += (long long) arr[i]; 
    } 
    return -1; 
} 

當我拿着Codility演示測試中,我與for循環使用的方法(下)最初開始爲0,我收到一個「錯誤爲1, 5, 2, 1, 4, 0和Codility測試用例答案」的消息一直在尋找的11

我修改這兩個for環在我的方法,並開始在i = 1第一環和第二環在i = 2結果,直到它產生了11,Codility滿意的結果與...搭訕。我基本上只是調整了方法,直到Codility開心爲止(我開始射擊11,因爲Codility指出這是他們正在尋找的答案),但我不知道爲什麼Codility很高興或者我的調整的重要性 - 只是命中和錯過:

 ... 
     int[] B = new int[] { 1, 5, 2, 1, 4, 0 }; 

     Console.WriteLine(solution3(B)); 
    } 

    public int solution3(int[] A) 
    { 
     long rsum = 0; 

     for (int i = 1; i < A.Count(); i++) 
      rsum += A[i]; 

     long lsum = A[0]; 
     int min = (int)Math.Abs(lsum - rsum); 

     for (int i = 2; i < A.Count() - 1; i++) 
     { 
      lsum += A[i]; 
      rsum -= A[i]; 
      int diff = (int)Math.Abs(lsum - rsum); 
      if (diff >= min) 
       min = diff; 
     } 

     return min; 
    } 

爲什麼這個調整(的命中和未命中)滿足Codility測試?什麼是均衡指數?它是如何到達的?注意:如果步驟A和步驟E之間有步驟(我將不得不在步驟之間直觀),步驟B,C和D是什麼?

回答

2

什麼是均衡指數?它是如何確定的?

想想你的陣列就像一塊有不同尺寸重物的板子(負重可以被認爲是連接在板子上的氦氣球)。每個重量從左到右編號。你的任務是在任何編號位置的董事會下方設置一個支點,使董事會達到平衡。 (我們會把板子本身看作是沒有重量的,並且假設重量與中心的距離並不重要。)無論哪個位置,板子平衡都是均衡指數。支點處的重量並不「計數」,因爲它不在任何一邊;它在中間。

這裏是第一示例的一個圖:

Equilibrium index = 3

在此,圖3是一種平衡指數,這是因爲權重應用到支點的左側的總和等於權重的總和至支點右側(-7 + 5 + 1 = -1 = -4 + 3 + 0)。

這裏是第二個例子:

Equilibrium index = 6

我們看到,圖6也是出於同樣的原因的平衡指數。支點左側的所有元素總和爲零。由於支點右側沒有元素,所以這個總和也是零。

的基本算法找到平衡指標是:

  1. 循環陣列之上,並添加了所有的元素。撥打這筆款項total
  2. 將變量left_sum初始化爲零。
  3. 將變量right_sum初始化爲total
  4. 現在再次循環陣列。對於每個陣列項目:
    1. right_sum減去當前項目的值。
    2. left_sumright_sum進行比較。如果它們相等,那麼當前項目的指數就是均衡指數。
    3. 將當前項目的值添加到left_sum

這就是它的全部。現在有意義嗎?


我的算法是怎麼回事?

至於爲什麼「Codility演示測試」期望結果爲11的數組包含元素{ 1, 5, 2, 1, 4, 0 },我不能說。您從未在您的問題中說過演示問題究竟是什麼。如果問題是在該數組中找到第一個均衡指數,那麼答案就是該數組沒有。通過上面的算法步進,這裏是每個數組索引的左,右和:

Index Left Right 
----- ---- ----- 
    0  0  12 
    1  1  7 
    2  6  5 
    3  8  4 
    4  9  0 
    5 13  0 

正如你所看到的,也沒有在該左總和等於正確的總和指標。預期的結果11甚至沒有意義,因爲只有六個元素。所以如果這個數組有一個均衡指數,它將不得不在0到5之間。所以我猜猜構成的問題一定是別的。在我甚至可以開始猜測你的算法爲什麼是或不正確之前,你必須在問題中包含問題陳述。

0

那麼,根據我所瞭解的一個數組的均衡指數,我提出了以下算法,我在另一個具有均衡索引作爲索引3和索引6的數組上測試,但我也在返回-1的原始數組(與11無關)。下面是示例:

 private void button6_Click_1(object sender, EventArgs e) 
    { 
     //int[] arr = new int[7] { -7, 1, 5, 2, -4, 3, 0 }; //--new array 
     int[] arr = new int[6] { 1, 5, 2, 1, 4, 0 }; //--original array 
     List<int> lst = new List<int>(); 
     int p = arr.Length; 
     int i = 0; 
     int q = 0; 
     int t = 0; 
     do 
     { 
      t = equilibrium(arr, arr.Length, q); 
      if (lst.IndexOf(t) == -1) 
       lst.Add(t); 
      q = t; 
      i++; 
     } while (i < p); 

     foreach (var m in lst) 
      Console.WriteLine(m);    
    } 

    private int equilibrium(int[] arr, int n, int q1) 
    { 
     int i, j; 
     int leftsum, rightsum; 

     for (i = 0; i < n; ++i) 
     { 
      leftsum = 0; 
      rightsum = 0; 

      for (j = 0; j < i; j++) 
      leftsum += arr[j]; 

      for (j = i + 1; j < n; j++) 
      rightsum += arr[j]; 

      if (leftsum == rightsum && q1 != i) 
      return i; 
     } 

     return -1; 
    } 

該算法對我來說很有意義,但是當我int數組試圖在Codility [] ARR =新INT [] {2,2,1,0,1} ;我得到了一個「錯誤的答案 - 預計3」在我的測試應用程序中,我的算法返回了一個1,這是它在Codility上返回的結果。他們在哪裏拿出3這個陣列?因此,我不明白數組的均衡指數。任何建議感激。