2021-08-07:与数组中元素的最大异或值。给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries ,其中 queries[i] = [xi, mi] 。第 i 个查询的答案是 xi 和任何 nums 数组中不超过 mi 的元素按位异或(XOR)得到的最大值。换句话说,答案是 max(nums[j] XOR xi) ,其中所有 j 均满足 nums[j] <= mi 。如果 nums 中的所有元素都大于 mi,最终答案就是 -1 。返回一个整数数组 answer 作为查询的答案,其中 answer.length == queries.length 且 answer[i] 是第 i 个查询的答案。

福大大 答案2021-08-07:

前缀树。数组的元素的二进制,前缀树存最小值。

代码用golang编写。代码如下:

package main

import (
"fmt"
"math"
) func main() {
nums := []int{0, 1, 2, 3, 4}
queries := [][]int{{3, 1}, {1, 3}, {5, 6}}
ret := maximizeXor(nums, queries)
fmt.Println(ret)
} func maximizeXor(nums []int, queries [][]int) []int {
N := len(nums)
trie := NewNumTrie()
for i := 0; i < N; i++ {
trie.add(nums[i])
}
M := len(queries)
ans := make([]int, M)
for i := 0; i < M; i++ {
ans[i] = trie.maxXorWithXBehindM(queries[i][0], queries[i][1])
}
return ans
} type Node struct {
min int
nexts []*Node
} func NewNode() *Node {
ans := &Node{}
ans.min = math.MaxInt64
ans.nexts = make([]*Node, 2)
return ans
} func getMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
} type NumTrie struct {
head *Node
} func NewNumTrie() *NumTrie {
ans := &NumTrie{}
ans.head = NewNode()
return ans
} func (this *NumTrie) add(num int) {
cur := this.head
this.head.min = getMin(this.head.min, num)
for move := 30; move >= 0; move-- {
path := (num >> move) & 1
if cur.nexts[path] == nil {
cur.nexts[path] = NewNode()
} else {
cur.nexts[path] = cur.nexts[path]
}
//cur.nexts[path] = cur.nexts[path] == null ? new Node() : cur.nexts[path];
cur = cur.nexts[path]
cur.min = getMin(cur.min, num)
}
} // 这个结构中,已经收集了一票数字
// 请返回哪个数字与X异或的结果最大,返回最大结果
// 但是,只有<=m的数字,可以被考虑
func (this *NumTrie) maxXorWithXBehindM(x int, m int) int {
if this.head.min > m {
return -1
}
// 一定存在某个数可以和x结合
cur := this.head
ans := 0
for move := 30; move >= 0; move-- {
path := (x >> move) & 1
// 期待遇到的东西
best := path ^ 1
if cur.nexts[best] == nil || cur.nexts[best].min > m {
best ^= 1
} else {
best ^= 0
}
//best ^= (cur.nexts[best] == null || cur.nexts[best].min > m) ? 1 : 0;
// best变成了实际遇到的
ans |= (path ^ best) << move
cur = cur.nexts[best]
}
return ans
}

执行结果如下:


左神java代码

2021-08-07:与数组中元素的最大异或值。给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries ,其中 queries[i] = [xi, mi] 。第 i 个查询的答案是的更多相关文章

  1. PHP方便快捷的将二维数组中元素的某一列值抽离出来作为此二维数组内元素的key

    得益于PHP的强大的内置数组函数array_column();array_combine(); 举个小栗子: <?php // 先查询出用户的基本信息 $userArray = [['id' = ...

  2. javascript中获取字符串或数组中元素的索引

    有些时候,我们需要知道一个字符串中字符的位置,或者一个数组中元素的位置,这是就需要对该变量进行迭代操作. 对于数组,有两个方法indexOf和findIndex() , 需要注意的是,findInde ...

  3. js删除数组中元素 delete 和splice的区别

    例如我有一个数组: var array = ["aa","dd","cc","aa"] ,我想删除这个数组的“dd”元素 ...

  4. 如何解决jersey框架中以json格式返回数组,当数组中元素一个时json格式不对

    原文地址:http://www.cnblogs.com/swpk/p/3566536.html?utm_source=tuicool jersey 是oracle 出的一个较好的REST框架.使用此框 ...

  5. js删除数组中元素的方法

    一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删 ...

  6. 使用Arraylist将数组中元素随机均等乱序分为N个子数组

    使用Arraylist将数组中元素随机均等乱序分为N个子数组 觉得有用的话,欢迎一起讨论相互学习~Follow Me 为了将数组中的元素 随机地 ,均等地, 不重复地 ,划分到N个子数组中 使用Arr ...

  7. 根据Bool值挑选数组中元素

    根据Bool值挑选数组中元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 使用Boolean类型的数组挑选一维数组中的值 使用一维Boolean数组选取数组中的特定元素,对应位置为True ...

  8. JavaScript Array reverse 方法:颠倒数组中元素的顺序

    在JavaScript中,Array对象的reverse()方法将颠倒(反转)数组中元素的顺序.arr.reverse()在原数组上实现这一功能,即,reverse()会改变原数组. 例1:将数组元素 ...

  9. 黑马基础阶段测试题:定义一个int类型的数组,数组中元素为{5,7,3,9,4}。求出数组中的最小值,并判断最小值是否为偶数,如果是偶数则输出“最小值为偶数”,如果不是偶数则输出“最小值为奇数”。打印如下:

    package com.swift; import java.util.Arrays; public class ArrayTest { public static void main(String[ ...

  10. JS中split使用方法和数组中元素的删除

    JS中split使用方法和数组中元素的删除 JS中split使用方法 <script language="javascript"> function spli(){ d ...

随机推荐

  1. .Net中跨域问题的解决方案

    开发中前端与后端完全分离并分开发布,遇到跨域问题,一通百度之后,解决方案如下: 把下面的代码放在web.config文件中的 System.WebServer 节点下 <httpProtocol ...

  2. python selenium 操作文件上传,并发操作时,文件选择窗口混乱解决方案

    上传文件 使用的是 python + autoit 模块,这种方式有一个问题,当出现多条任务同时选择文件上传的时候,无法判断那个文件选择窗口的归属,从而出现上传了错误的文件! 解决方法: 要上载文件而 ...

  3. Linux & 标准C语言学习 <DAY12_2>

    一.堆内存     1.什么是堆内存         是进程的一个内存段(text.data.bss.stack.heap)         由程序员手动管理         特点是足够大,缺点是使用 ...

  4. Linux & 标准C语言学习 <DAY8_1>

    一.进制转换     1.为什么要使用二进制.八进制.十六进制         因为目前的CPU只能识别高低两种电平,只能对二进制数据进行计算         二进制虽然能够直接被计算机识别,但是不方 ...

  5. Kafka 消息送达语义

    更多内容,前往IT-BLOG 消息送达语义是消息系统中一个常见的问题,主要包含三种语义:[1]At most once:消息发送或消费至多一次:[2]At least once:消息发送或消费至少一次 ...

  6. 非常小的一个东西,Spring依赖注入Bean类型的8种情况

    大家好,我是三友~~ 今天来讲一个可能看似没有用但是实际又有点用的一个小东西,那就是@Autowired支持注入哪些Bean的类型. 为啥要讲这个呢? 故事说起来可能就比较长了. 不过长话可以短说,仅 ...

  7. ES(ECMAScript)标准下中的let、var和const

    ES标准下中的let,var和const let会报重复声明,var则比较随意,重不重复无所谓 // 使用 var 的时候重复声明变量是没问题的,只不过就是后面会把前面覆盖掉 var num = 10 ...

  8. AcWing 1902. 马拉松

    题目链接 每次路程改变只对前后两点间距离有影响,因此每次都判断当前三个点之间的距离之和与去掉中间点的距离哪个更优即可,最后取最大值作为结果输出. #include<iostream> #i ...

  9. CTF-NEFU校赛-题解

    Write by NEFUNSI: ghosin 0ERROR 签到 signin 下载 signin.txt 打开得到一串 base64,解码得到 flag{we1come_t0_NEFUCTF!} ...

  10. argparser Python包使用

    argparser Python包使用 导入 import argparse 定义parser对象(参数为介绍) parser = argparse.ArgumentParser('test pars ...