Pairwise

                         Photo: rostwoodworks.com

題目:
  找到你的另一半 都說優秀的程序員擅長面向對象編程,但卻經常找不到另一半,這是為什麽呢?因為你總是把自己局限成為一個程序員,沒有打開自己的思維。 這是一個社群的時代啊,在這裏你應該找到與你有相同價值觀但又互補的另一半。 譬如:你編程能力強,估值11分,如果以20分為最佳情侶來計算,你應該找一個設計能力強,估值為9分的女生。 那麽當你遇到一個設計能力為9分的女生,千萬別猶豫,大膽去表白。千萬別以為後面的瓜比前面的甜哦。 舉個例子:有一個能力數組[7,9,11,13,15],按照最佳組合值為20來計算,只有7+13和9+11兩種組合。而7在數組的索引為0,13在數組的索引為3,9在數組的索引為1,11在數組的索引為2。 所以我們說函數:pairwise([7,9,11,13,15],20) 的返回值應該是0+3+1+2的和,即6。

function pairwise(arr, arg) {
  var pairwiseIndex = [];
  var prevIndex = -1;
  for(var i=0;i < arr.length; i++)
  {
    var checkIndex = arr.indexOf(arg - arr[i]);
    //要找的pair值跟上次一樣時會找到跟上莿桐一個位置的元素,因為indexOf是找第1個符合條件的元素,故從上一次找到的index的後一個位置開始找
    if(pairwiseIndex.indexOf(arg - arr[i]) != -1 && prevIndex == arr.indexOf(arg - arr[i]) )
        checkIndex = arr.indexOf(arg - arr[i], prevIndex + 1);
    if(checkIndex != -1 && pairwiseIndex.indexOf(i) == -1 && pairwiseIndex.indexOf(checkIndex) == -1 && i != checkIndex )
    {
        pairwiseIndex.push(i);
        pairwiseIndex.push(checkIndex);
    }
    prevIndex = checkIndex;    
  }
  return (pairwiseIndex.length > 0) ? pairwiseIndex.reduce(function(previousVal, currentVal, index, array)
                              {
                                  return previousVal + currentVal;
                              }) : 0;   
}


pairwise([1,4,2,3,0,5], 7);
pairwise([1, 3, 2, 4], 4);
pairwise([1, 1, 1], 2);
pairwise([0, 0, 0, 0, 1, 1], 1);

測試的正確結果

pairwise([1, 4, 2, 3, 0, 5], 7) 应该返回 11.
pairwise([1, 3, 2, 4], 4) 应该返回 1.
pairwise([1, 1, 1], 2) 应该返回 1.
pairwise([0, 0, 0, 0, 1, 1], 1) 应该返回 10.
pairwise([], 100) 应该返回 0.

Solution:

  題目要我們找到2個數字合起來等同一個特定數字,也就是天生一對,這就如同卡榫(dovetail)一般互補的存在,找法就是將array所有元素訪問過一遍,並依據用給定值arg減掉現在arr索引的值,然後再去array裡面找(indexOf)存不存在這個值,存在就將它記錄在pairwiseIndex這個array中,值得注意的是如果要找的值與前幾次一樣,就得把上次找到的元素位置(index or location)記錄下來,然後下次從這個位置的下一個位置開始找(index + 1 / prevIndex +1),不然會因為indexOf的特性的關係都找到同一個值,而沒被記錄下來就這樣漏掉了,最後用reduce把所有element總和,而且要記得判斷pairwiseIndex是不是空array 是的話return 0



**P.S. / Reference:  Array.reduce()
      

results matching ""

    No results matching ""