转换数组中的第K个元素

普拉蒂·羽衣甘蓝

我在最近的一次采访中遇到了这个问题:

给定A长度数组N,我们应该回答Q查询。查询形式如下:

给定xk,我们需要制作另一个B相同长度的数组,使得XOR运算符B[i] = A[i] ^ x在哪里^按降序对数组B排序并返回B[k]

输入格式:第一行包含整数N第二行包含N个表示数组的整数A第三行包含Q,即查询数量接下来的Q行包含以空格分隔的整数x和k

输出格式:在新行中分别打印B [k]值以进行Q查询。

例如用于输入:

5
1 2 3 4 5
2
2 3
0 1

输出将是:

3
5

对于第一个查询,A = [1, 2, 3, 4, 5]对于查询x = 2k = 3B = [1^2, 2^2, 3^2, 4^2, 5^2] = [3, 0, 1, 6, 7]按降序排序B = [7, 6, 3, 1, 0]因此,B[3] = 3

对于第二个查询,AB相同x = 0所以,B[1] = 5

我不知道如何解决这些问题。提前致谢。

马拉卡

在O(N + Q)中可解决。为简单起见,我假设您只处理正数或无符号值,但是您也可以针对负数调整此算法。

首先,您要建立一个二叉树。左边缘代表0,右边缘代表1。在每个节点中,您存储此存储桶中的数字。这可以在O(N)中完成,因为位数是恒定的。

因为这有点难以解释,所以我将展示3位数字[0、1、4、5、7],即[000、001、100、101、111]的树的外观

          *
     /         \
    2           3            2 numbers have first bit 0 and 3 numbers first bit 1
   / \       /     \ 
  2   0     2       1        of the 2 numbers with first bit 0, have 2 numbers 2nd bit 0, ...
 / \       / \     / \
1   1     1   1   0   1      of the 2 numbers with 1st and 2nd bit 0, has 1 number 3rd bit 0, ...

要回答单个查询,您可以使用x位向下浏览。在每个节点上,您有4种可能性,查看x的位b并建立答案a,该答案最初为0:

  1. b = 0且k <存储在当前节点的左子节点(0位分支)中的值:当前节点变为左子节点,a = 2 * a(向左移动1)

  2. b = 0并且k> =存储在左子节点中的值:当前节点变为右子节点,k = k-左子节点的值,a = 2 * a + 1

  3. b = 1且k <存储在右子节点中的值(1位分支,由于异或运算,所有内容都被翻转):当前节点变为右子节点,a = 2 * a

  4. b = 1并且k> =存储在右子节点中的值:当前节点变为左子节点,k = k-右子节点的值,a = 2 * a + 1

再次是O(1),因为位数是恒定的。因此,总体复杂度为O(N + Q)。

示例:[0、1、4、5、7],即[000,001,100,101,111],k = 3,x = 3,即011

  1. 第一位为0并且k> = 2,因此我们继续,k = k-2 = 3-2 = 1且a = 2 * a + 1 = 2 * 0 + 1 = 1。

  2. 第二位是1并且k> = 1,因此我们向左移动(因为该位是1,所以求反),k = k-1 = 0,a = 2 * a + 1 = 3

  3. 第三位是1并且k <1,所以解是a = 2 * a + 0 = 6

控制:[000,001,100,101,111] XOR 011 = [011,010,111,110,100]即[3,2,7,6,4]和在顺序[2,3,4,6,7],因此索引3的数字确实是6和解(这里总是谈论基于0的索引)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用分区的数组中第K个最小元素

来自分类Dev

递归获得数组中第k个最小的元素

来自分类Dev

在数组MIPS中查找第K个不同的元素

来自分类Dev

向数组中插入绝对差后,找到数组中的第k个最大元素

来自分类Dev

Haskell中列表的第K个元素

来自分类Dev

使用“基于元素的K个数组的排列数”算法,数组中第K个最大数

来自分类Dev

如何在python中添加到numpy数组的第k + 1个元素?

来自分类Dev

Prolog在列表中查找第K个元素

来自分类Dev

删除链表中的第k个元素(Java实现)

来自分类Dev

在扩展字符串中查找第k个元素

来自分类Dev

特殊矩阵的螺旋遍历中的第K个元素

来自分类Dev

特殊矩阵的螺旋遍历中的第K个元素

来自分类Dev

Java:使用2个数组查找数组的第K个最大元素

来自分类Dev

Scala从数组/ RDD中选择第n个元素中的第n个元素

来自分类Dev

在Fortran中,如何从数组中删除第N个元素?

来自分类Dev

如何使用PHP在JSON数组中打印第1,第3,第5个元素

来自分类Dev

如何在PHP中访问数组的第N个元素

来自分类Dev

Python删除数组中的每个第n个元素

来自分类Dev

仅获取json数组中的第4个元素

来自分类Dev

从数组中删除第n个元素并对其重新索引

来自分类Dev

从数组(char *)中删除第n个元素

来自分类Dev

从swift数组中删除每个第n个元素

来自分类Dev

无法在Javascript中访问多维数组的第n个元素

来自分类Dev

在Kotlin中调用布尔数组的第6个元素

来自分类Dev

仅获取json数组中的第4个元素

来自分类Dev

如何在JavaScript中获取数组的第n个元素?

来自分类Dev

两个排序数组的并集中的第k个最小元素

来自分类Dev

两个排序数组的并集中的第k个最小元素

来自分类Dev

从两个排序的数组中找到第k个最小的元素

Related 相关文章

  1. 1

    使用分区的数组中第K个最小元素

  2. 2

    递归获得数组中第k个最小的元素

  3. 3

    在数组MIPS中查找第K个不同的元素

  4. 4

    向数组中插入绝对差后,找到数组中的第k个最大元素

  5. 5

    Haskell中列表的第K个元素

  6. 6

    使用“基于元素的K个数组的排列数”算法,数组中第K个最大数

  7. 7

    如何在python中添加到numpy数组的第k + 1个元素?

  8. 8

    Prolog在列表中查找第K个元素

  9. 9

    删除链表中的第k个元素(Java实现)

  10. 10

    在扩展字符串中查找第k个元素

  11. 11

    特殊矩阵的螺旋遍历中的第K个元素

  12. 12

    特殊矩阵的螺旋遍历中的第K个元素

  13. 13

    Java:使用2个数组查找数组的第K个最大元素

  14. 14

    Scala从数组/ RDD中选择第n个元素中的第n个元素

  15. 15

    在Fortran中,如何从数组中删除第N个元素?

  16. 16

    如何使用PHP在JSON数组中打印第1,第3,第5个元素

  17. 17

    如何在PHP中访问数组的第N个元素

  18. 18

    Python删除数组中的每个第n个元素

  19. 19

    仅获取json数组中的第4个元素

  20. 20

    从数组中删除第n个元素并对其重新索引

  21. 21

    从数组(char *)中删除第n个元素

  22. 22

    从swift数组中删除每个第n个元素

  23. 23

    无法在Javascript中访问多维数组的第n个元素

  24. 24

    在Kotlin中调用布尔数组的第6个元素

  25. 25

    仅获取json数组中的第4个元素

  26. 26

    如何在JavaScript中获取数组的第n个元素?

  27. 27

    两个排序数组的并集中的第k个最小元素

  28. 28

    两个排序数组的并集中的第k个最小元素

  29. 29

    从两个排序的数组中找到第k个最小的元素

热门标签

归档