Algorithm 使位为正
我在解决一个问题,它说我们需要找到所有需要添加到数组中元素的最小数之和,以便按位and大于0 例如:给定的数组是[4,4,3,2] 那么输出应该是3 (在第一、第二和第四元素中添加一个元素)Algorithm 使位为正,algorithm,data-structures,Algorithm,Data Structures,我在解决一个问题,它说我们需要找到所有需要添加到数组中元素的最小数之和,以便按位and大于0 例如:给定的数组是[4,4,3,2] 那么输出应该是3 (在第一、第二和第四元素中添加一个元素) 我的方法是:首先,我决定在所有元素中找到最右边的集合的位置,并检查要添加的总最小数,以便and大于零。但这不起作用。有人能帮我们找到另一种算法吗?让我们先解决一个稍微不同的问题: 为确保1位于kth位置(零位),应在value中添加哪个最小min数字 我们这里有两个案例: 如果value在k位置有1,我们添
我的方法是:首先,我决定在所有元素中找到最右边的集合的位置,并检查要添加的总最小数,以便and大于零。但这不起作用。有人能帮我们找到另一种算法吗?让我们先解决一个稍微不同的问题: 为确保
1
位于k
th位置(零位),应在value
中添加哪个最小min
数字
我们这里有两个案例:
如果value
在k
位置有1
,我们添加0
(不做任何操作)
如果值
在k
位置有0
,我们可以添加
min = 100...000000000 - (value & 11.....11111)
<- k zeroes -> <- k ones ->
我们应该补充一点
0b100 - (0b011 & 0b11) == 4 - 3 == 1
让我们添加:3+1==4==0b100
,它在第二位有1
0b011
^
we want 1 here
现在我们可以扫描所有32个位置(如果integer是一个好的32位integerint
);C#代码:
结果:
3
请仅标记与问题相关的语言。如果不相关,因为问题是关于算法的,所以不标记是否允许将
1
添加到3d项,将2
添加到第4项(3
),并将4&4&4==4
?或者我们必须在示例中添加相等的数字作为1
?@DmitryBychenko是的,这是允许的。即使如此,结果也将是3。(1 + 2)
private static long MinToAdd(IEnumerable<int> items) {
long best = 0;
for (int i = 0; i < 32; ++i) {
long sum = 0;
foreach (int item in items)
sum += AddToEnsureOne(unchecked((uint)item), i); // uint - get rid of sign
if (i == 0 || sum < best)
best = sum;
}
return best;
}
Console.Write(MinToAdd(new int[] { 4, 4, 3, 2}));
3