📅  最后修改于: 2023-12-03 14:58:28.069000             🧑  作者: Mango
这道题目是GATE-CS-2009年考试中的一道题目,考察了程序员的算法和数据结构的知识。下面我会为大家详细的介绍这道题目。
给定一个整数数组A,其中每个元素是一个非负整数,以二进制表示。例如:一些元素可以表示为110,1010,11100等等。定义一个数X的权重为X中的1的个数。例如,1011的权重为3。现在,对于所有的元素A[i],你需要计算权重的总和S。您可以使用一些辅助数组来简化代码。
例如,给定以下数组A:
[1, 2, 3]
你的函数应该返回S=4。给定以下数组A:
[4, 6, 8]
你的函数应该返回S=7。
输入的参数是一个整数数组,其中元素为非负整数。
输出的结果是一个整数,表示所有元素的权重总和。
输入: [1, 2, 3] 输出: 4
输入: [4, 6, 8] 输出: 7
这道题目需要我们求出数组中所有元素二进制中1的个数的总和,我们可以使用一个辅助数组来保存非负整数n的二进制中1的个数,例如count[n],其中n为非负整数。我们可以通过n & (n-1)来计算n的一个最小的1被移除后的二进制表示,即count[n] = count[n & (n-1)] + 1。我们可以预处理所有小于等于a[i]的数字的1的个数,然后使用这个数字计算a[i]的1的个数。
下面是代码的实现,使用Python语言:
def countSetBits(n):
count = 0
while (n):
n &= (n-1)
count += 1
return count
def countBits(n):
countArr = [0] * (n+1)
for i in range(n+1):
countArr[i] = countArr[i & (i-1)] + 1
return countArr
def totalSetBits(arr):
n = max(arr)
countArr = countBits(n)
sum = 0
for i in range(len(arr)):
sum += countArr[arr[i]]
return sum
在这段代码中,我们定义了三个函数,第一个函数countSetBits用来计算一个非负整数n的二进制中1的个数。第二个函数countBits用来预处理所有小于等于n的数字的1的个数,它会返回所有数字对应1的个数的数组。第三个函数totalSetBits使用countBits函数计算非负整数n的二进制中1的个数的和。最终,我们可以通过调用totalSetBits函数来得出答案。