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. vue中的观察者模式和发布订阅者模式

    观察者模式 目标者对象和观察者对象有相互依赖的关系,观察者对某个对象的状态进行观察,如果对象的状态发生改变,就会通知所有依赖这个对象的观察者, 目标者对象 Subject,拥有方法:添加 / 删除 / ...

  2. python abseil库(app, flags, logging)总结

    absl (Abseil PythonCommon Libraries)(https://abseil.io/docs/python/)是用于构建Python应用程序的Python库代码集合,它包括三 ...

  3. Spring设计模式——代理模式[手写实现JDK动态代理]

    代理模式 代理模式(Proxy Pattern):是指为其他对象提供一种代理,以控制对这个对象的访问. 代理对象在客户端和目标对象之间起到中介作用,代理模式属于结构型设计模式. 使用代理模式主要有两个 ...

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

    Linux系统简单介绍:     BCPL->New B->C->UNIX->Minix->Linux->gcc     美国贝尔实验室 1968     Linu ...

  5. 一文学会Flex布局

    参考: <CSS权威指南>(第四版) flex布局教程-语法篇-阮一峰 1.Flex布局是什么 FlexBox,弹性盒布局,顾名思义,就是元素具有弹性,能根据可用空间大小增减尺寸. 2.基 ...

  6. Linux文件上传下载--rz/sz命令

    原文地址:https://www.cnblogs.com/igoodful/p/14694038.html 1.rz 命令 1.1 命令简介 rz 命令(Receive ZMODEM),使用 ZMOD ...

  7. 一个基于GPT模型实现的Git Commit信息自动生成工具

    每次提交代码的时候,你是否有为如何写Commit Message而迟迟按不下提交的时刻呢?然后,死磨硬泡写了一些并提交后,又被review的小伙伴吐槽了呢?相信很多小伙伴有过这样的经历吧? 趁着最近C ...

  8. 8.XSS和CSRF漏洞

    XSS和CSRF漏洞 目录 XSS和CSRF漏洞 XSS漏洞介绍 XSS分类 利用XSS漏洞如何实行攻击 利用XSS盗取用户的Cookie 利用XSS实行钓鱼 利用XSS进行键盘监控 CSRF漏洞介绍 ...

  9. Prometheus服务发现之kubernetes_sd_config

    一.为什么要使用Prometheus服务发现 之前我们讲过通过配置prometheus-operator的CRD ServiceMonitor来达到K8S集群相关组件和微服务的监控的目的,可以在Ser ...

  10. gulp基本操作

    1.安装淘宝镜像 npm install cnpm -g --registry=https://registry.npm.taobao.org cnpm -v 2.生成项目描述文件 package.j ...