2013-12-18 128 views
2

我一直在努力提高我的Javascript,並一直在經歷Coderbyte的挑戰。我無法完全破解的唯一簡單挑戰就是「Array Addition 1」*。我想與誰得到了以下配置的完美應對其他用戶比較我的代碼:for循環中的Javascript按位邏輯

function ArrayAdditionI(arr) { 

    for (var i = 0; i < arr.length; i++) { 
    arr[i] = parseInt(arr[i], 10); 
    } 

    var max = arr[0]; 
    for (var i = 1; i < arr.length; i++) { 
    max = Math.max(max, arr[i]); 
    } 
    //everything above makes sense 
    for (var i = 0, l = 1 << arr.length; i < l; i++) { 
    var s = 0, cnt = 0; 
    for (var j = 0; j < arr.length; j++) { 
     if (i & (1 << j)) { 
     s += arr[j]; 
     cnt++; 
     } 
    } 

    if (cnt > 1 && s == max) { 
     return true; 
    } 
    } 

    return false;  
} 

ArrayAdditionI(/* some array*/)   

可能有人請與如何按位運算符正在上面使用一個普通的英語解釋幫助嗎?

[*]

具備的功能ArrayAdditionI(ARR)取在ARR存儲 號數組和返回字符串true如果 數組中的數字的任何組合可以加起來等於數組中最大的數字, 否則返回字符串false。例如:如果arr包含[4,6, 23,10,1,3],則輸出應該返回true,因爲4 + 6 + 10 + 3 = 23.該數組不會包含全部元素,並可能包含負數。

+0

代碼的作者使用它來獲取元素 – zerkms

+0

感謝的所有排列,所以我假定(但不知道)l表示數組中的元素的所有邏輯組合。我不理解的是它如何在if語句中用作布爾條件。例如,0和64 = true或false? – vagon

+0

當您檢查設置的位時 - 您檢查數字是否不是虛假。所以如果它是'0'的 - 它被視爲'false',否則'true'。檢查'10&(1 << 0)'和'10&(1 << 1)' – zerkms

回答

1

使用該代碼作者創建所有元素的排列。

說明:

假設我們有4個要素:

  1. 外環迭代0..15
  2. 內環檢查的i特定位被設置i & (1 << j)
  3. 如果設置 - 累積總和
  4. 在我們遍歷所有比特之後 - 檢查總和是否等於預期值

PS:cnt > 1檢查和需要創建多個號碼不是一個

PPS的:一個迭代的詳細說明。

我們來設想一下當前的i = 101010二進制)。

所以,當我們執行一個嵌套的循環 - 我們會檢查,只有2和第4位被設置,這意味着我們將努力總結陣列的第二和第四個元素。然後檢查它們的總和等於最大值。