我最近接受了Codility测试,我想知道如何否定 -2 base 数字?
例如,数组[1,0,0,1,1]
代表基数-2 中的 9 :
-2 bases:
1,-2,4,-8,16
1 + (-8) + 16 = 9
[1,0,0,1,1]
base -2 中的负9为:
-2 bases:
1,-2,4,-8
1 + (-2) + -8 = -9
[1,1,0,1]
我对这个问题一无所知。必须有一些直观的解决方案。你有任何提示吗?
答案 0 :(得分:14)
在基数-2中,位置 i 的1表示(-2) i 。
因此,位置[ i , i +1]中的[1,1]表示(-2) i +(-2) I 1 =(-2) I +(-2 )( - 2) I =(1 + -2)( - 2) I = - ( - 2) I
因此,您可以通过将其更改为[1,1]来否定任何[1,0]的出现,反之亦然。
当然,任何其他出现的0都可以保持不变:-0 = 0。
所以在你的例子中,我们将[1,0,0,1,1]分成[{1,0},{0},{1,1}],否定每个部分得到[{1,1} },{0},{1,0}],即[1,1,0,1,0],并删除不必要的高0,产生[1,1,0,1]。
答案 1 :(得分:4)
让我们尝试一些例子:
(16 -8 4 -2 1)
1 = 0 0 0 0 1
-1 = 0 0 0 1 1
2 = 0 0 1 1 0
-2 = 0 0 0 1 0
3 = 0 0 1 1 1
-3 = 0 1 1 0 1
4 = 0 0 1 0 0
-4 = 0 1 1 0 0
5 = 0 0 1 0 1
-5 = 0 1 1 1 1
我们可以尝试以数学方式定义:
给定输入I(b)(其中B是位数),
现在,这留下了O(b)为0,1或2的可能性,因为I(b)总是0或1。
如果O(b)是2,那就是"携带",让我们看几个载体的例子:
(16 -8 4 -2 1) (16 -8 4 -2 1)
1+1 = 0 0 0 0 2 = 0 0 1 1 0
-2-2 = 0 0 0 2 0 = 0 1 1 0 0
4+4 = 0 0 2 0 0 = 1 1 0 0 0
对于每个b,从0开始,如果O(b)> = 2,则从O(b)减去2并且增加O(b + 1)和O(b + 2)。这样做直到达到最大值B.
希望这足以详细解释它。
答案 2 :(得分:0)
假设您有一个数字A,那么-A = A-2 * A 或-A = A +(-2)* A。幸运的是您的基数为-2。 (-2)* A等于左移一位数。现在,您只需要实现A << 1 +A。数组移位很容易。然后,您需要实现一个很小的差别来实现二进制加法:每次进行一点加法运算时,都需要将其乘以-1。
public int[] solution(int[] input)
{
var A = new int[input.Length + 1];
var B = new int[input.Length + 1];
input.CopyTo(B, 1);
input.CopyTo(A, 0);
return GetResult(A, B).ToArray();
}
public IEnumerable<int> GetResult(int[] A, int[] B)
{
var r = 0;
for (int i = 0; i < A.Length; i++)
{
var currentSum = A[i] + B[i] + r;
r = -currentSum / 2;
yield return currentSum % 2;
}
}
对不起,但示例在C#中