我在一次招聘竞赛中发现了这个问题(现在已经结束了)。这就是它:
给定两个自然数N和X。您需要创建一个由N个自然数组成的数组,使这些数字的逐位XOR等于X。该数组中所有可用自然数的总和尽可能小。
如果存在多个数组,则打印最小数组
数组A<数组B如果
对于任何索引i,Ai < Bi;对于小于i的所有索引,Ai=Bi
示例输入: N=3、X=2
示例输出:1 1 2
说明:我们必须打印3个具有最小和的自然数,因此N间隔的数字是1 1 2
我的方法是:如果N是奇数,我把N-1放入数组(这样他们的xor就是0),然后把X
如果N是偶数,我再放N-1个1,然后放X-1(如果X是奇数)和X+1(如果X是偶数)
但是这个算法在大多数测试用例中都失败了。例如,当N=4和X=6时,我的输出是
1 1 1 7,但它应该是1 1 2 4
有人知道如何使数组和最小化吗?
发布于 2019-09-10 01:41:17
为了获得最小和,您需要确保当您的目标是X时,您不会取消X的位并重新创建它们。因为这会增加总和。为此,您需要从数组的末尾开始逐个(理想情况下)创建X的位。因此,与您的N=4和X=6示例一样,我们有:(我使用^来显示xor)
X= 7= 110 (二进制)=2+ 4。请注意,2^4也=6,因为这些数字不共享任何公共位。所以,输出是1124。
因此,我们首先从输出数组的末尾创建X的最高有效位。然后,我们还必须处理N的不同值的边角情况。我将用一些不同的例子来阐明这一点:
``
A) X=14, N=5:
X=1110=8+4+2. So, the array is 1 1 2 4 8.
B) X=14, N=6:
X=8+4+2. The array should be 1 1 1 1 2 12.
C) X=15, N=6:
X=8+4+2+1. The array should be 1 1 1 2 4 8.
D) X=15, N=5:
The array should be 1 1 1 2 12.
E) X=14, N=2:
The array should be 2 12. Because 12 = 4^8
``因此,我们如下所示。我们计算X中2的幂的个数。设这个数是k。
情况1- If k <= n(示例E):我们从左到右选取最小的幂,并将剩余的幂合并到数组中的最后一个位置。
奇数情况2-如果k >n(例如A,B,C,D):我们计算h=n-k。如果h是奇数,我们把h= n-k+1。现在,我们把h1放在数组的开头。然后,剩余的位置数小于k。因此,对于剩余的位置,我们可以遵循情况1的想法。请注意,在第二种情况下,我们不是奇数加1,而是偶数加1,然后在最后进行一些合并。这保证了数组是尽可能小的。
发布于 2019-09-10 01:35:04
我们必须考虑,我们必须最小化用于求解的数组的总和,这是关键点。首先计算N中的集合比特假设如果集合比特的计数小于或等于X,则基于集合比特将N除以X个整数,例如
N= 15,X=2
15中的设置位是4解决方案是114
如果X=3
解决方案是1 2 12,这也最小化了数组和。
设置位大于X时的其他情况
计算差值= setbits(N) -X
如果差值相等,则根据需要添加1,并应用上述算法,所有的1都将被抵消。
如果差异是奇数,则添加1,但现在您需要处理答案数组中的1个额外的值。也检查一下角落里的箱子。
https://stackoverflow.com/questions/57857373
复制相似问题