首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数字的XOR =X

数字的XOR =X
EN

Stack Overflow用户
提问于 2019-09-09 23:53:21
回答 2查看 924关注 0票数 4

我在一次招聘竞赛中发现了这个问题(现在已经结束了)。这就是它:

给定两个自然数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

有人知道如何使数组和最小化吗?

EN

回答 2

Stack Overflow用户

发布于 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的不同值的边角情况。我将用一些不同的例子来阐明这一点:

代码语言:javascript
运行
复制
``
 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,然后在最后进行一些合并。这保证了数组是尽可能小的。

票数 5
EN

Stack Overflow用户

发布于 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个额外的值。也检查一下角落里的箱子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57857373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档