2016-10-24 42 views
0

我正在嘗試編寫一個函數,它將一個(無符號)整數作爲輸入,並返回在該數字的二進制表示中等於1的位數。從無符號整數計數位

例如:1234的二進制表示是10011010010,所以在這種情況下函數應返回5。

這裏是我的回答:

var newArr; 
var count = 0; 
function countBits(num){ 
    newArr = num.toString(2).split('').map(function(el){ 
     if(el == '1') 
      count++ 
    });; 
    return count; 
} 

在我的計劃時,我打電話countBits(7),它返回// 3,但是當我提出我的迴應,它說它返回// 4。根據問題,有人能夠看到我在回覆中丟失的內容嗎?

+0

看看會發生什麼,當你調用你的函數兩次在相同的數字上。 – Blender

+2

他們的測試工具可能會多次調用countBits。您從不將「count」重置爲「0」,因此它總計了它在所有呼叫中計算的總數。 'var count = 0;'應該在你的函數內而不是在它之前,而且你甚至不需要'newArr'變量。你可以使用'forEach'或'reduce'來代替地圖。如果你沒有在它接受的回調函數中返回一個值,那麼使用'map'沒有意義。 'forEach'更有意義。 – Paulpro

回答

3

你的問題是你聲明瞭函數外的變量,所以當函數被多次調用時,他們會保留它們的值並增加計數。

順便說一句,你也不應使用map,如果你不希望創建另一個陣列 - 這樣做的更好

function countBits(num){ 
    var newArr = num.toString(2).split('').map(Number); 
    var count = 0; 
    for (var i=0; i<newArr.length; i++) 
     count += newArr[i]; 
    } 
    return count; 
} 

function countBits(num){ 
    return num.toString(2).split('').reduce(function(count, el) { 
     return count + (el == "1"); 
    }, 0); 
}