2021-05-14:给定一个数组arr,想知道arr中哪两个数的异或结果最大。返回最大的异或结果。
2021-05-14:给定一个数组arr,想知道arr中哪两个数的异或结果最大。返回最大的异或结果。
福大大 答案2021-05-14:
前缀树。一个数,用二进制表示,0走左边分支,1走右边分支。准备一个max变量,遍历的时候,遇到比max还要大的,max更新。最后返回max。
时间复杂度:O(N)。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math"
)
func main() {
arr := []int{3, 10, 5, 25, 2, 8}
ret := findMaximumXOR(arr)
fmt.Println(ret)
}
func findMaximumXOR(arr []int) int {
if len(arr) < 2 {
return 0
}
max := math.MinInt64
numTrie := NewNumTrie()
numTrie.add(arr[0])
for i := 1; i < len(arr); i++ {
max = getMax(max, numTrie.maxXor(arr[i]))
numTrie.add(arr[i])
}
return max
}
type Node struct {
nexts []*Node
}
func NewNode() *Node {
ret := &Node{}
ret.nexts = make([]*Node, 2)
return ret
}
// 基于本题,定制前缀树的实现
type NumTrie struct {
// 头节点
head *Node
}
func NewNumTrie() *NumTrie {
ret := &NumTrie{}
ret.head = NewNode()
return ret
}
func (this *NumTrie) add(newNum int) {
cur := this.head
for move := 63; move >= 0; move-- {
path := (newNum >> move) & 1
if cur.nexts[path] == nil {
cur.nexts[path] = NewNode()
}
cur = cur.nexts[path]
}
}
// 该结构之前收集了一票数字,并且建好了前缀树
// num和 谁 ^ 最大的结果(把结果返回)
func (this *NumTrie) maxXor(num int) int {
cur := this.head
ans := 0
for move := 63; move >= 0; move-- {
// 取出num中第move位的状态,path只有两种值0就1,整数
path := (num >> move) & 1
// 期待遇到的东西
best := twoSelectOne(move == 63, path, path^1)
// 实际遇到的东西
best = twoSelectOne(cur.nexts[best] != nil, best, best^1)
// (path ^ best) 当前位位异或完的结果
ans |= (path ^ best) << move
cur = cur.nexts[best]
}
return ans
}
func twoSelectOne(condition bool, a int, b int) int {
if condition {
return a
} else {
return b
}
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下:

2021-05-14:给定一个数组arr,想知道arr中哪两个数的异或结果最大。返回最大的异或结果。的更多相关文章
- 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等
题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,下标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标 解析: ...
- [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...
- 2021.05.14 tarjan
2021.05.14 tarjan 标准版tarjan 这里使用数组来模拟栈 void tarjan(int x){ ++ind; dfn[x]=low[x]=ind; stacki[++top]=x ...
- 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...
- 【IT笔试面试题整理】给定一个数组a[N]构造数组b [N]
[来源]:腾讯2013实习生笔试 给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]-a[N-1] / a[j])空间复杂度和O(n)的时间复杂度:除遍历计数器与a ...
- 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序
题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序 public static int maxGap(int nums[]) { if ( ...
- 给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)
需求:给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换) 如: a 不替换 b 不替换 ab 不替换 ba 不替换 aba 不替换 aab 替换为 ...
- 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- 算法题——给定一个数组 arr,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
参考自:https://blog.csdn.net/qq_38200548/article/details/80688630 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] ...
- 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1 ...
随机推荐
- 记一个快捷在线接口YAPI
在线地址:http://192.168.252.152:3000 1.idea中file下setting中plugins搜索并加载插件YAPI 2.idea中的.idea中.misc.xml文件配置. ...
- [SUCTF 2019]EasySQL 1
这个题目搞了我好久,由于本人基础不扎实,试了好多方法,只发现有三种情况 Nonono.无返回结果和有返回 然后使用了新学习的堆叠注入,得到了数据库名和表名 想要查看Flag表的字段内容也查看不了 这里 ...
- MySQL学习(十一)B树与B+树了解
参考博客:https://www.cnblogs.com/kismetv/p/11582214.html
- Prometheus性能调优-什么是高基数问题以及如何解决?
背景 近期发现自己实验用的 Prometheus 性能出现瓶颈, 经常会出现如下告警: PrometheusMissingRuleEvaluations PrometheusRuleFailures ...
- VUE中的next({ ...to, replace: true })
beforeEach((to, from, next) => { next('/logon') } 上面这串代码我们可以看成为 beforeEach((to, from, next) => ...
- [大数据]Hadoop HDFS文件系统命令集
基本格式: hadoop fs -cmd [args] 1 Query 显示命令的帮助信息 # hadoop fs -help [cmd] 查看hadoop/hdfs的用户 # hdfs dfs -l ...
- [Java EE]解决浏览器跨域问题
1 解决浏览器跨域问题的方案 方式1: 浏览器(chrome)中取消跨域限制 step1 浏览器 chrome://flags step2 搜索:same step3 将搜索结果中的3个插件[Same ...
- 深度剖析Redis九种数据结构实现原理,建议收藏
1. Redis介绍 Redis 是一个高性能的键值存储系统,支持多种数据结构. 包含五种基本类型 String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),和 ...
- day33:进程锁&事件&进程队列&进程间共享数据
目录 1.锁:Lock 2.信号量:Semaphone 3.事件:Event 4.进程队列:Queue 5.生产者和消费者模型 6.JoinableQueue 7.Manager:进程之间共享数据 锁 ...
- Python ArcPy批量计算多时相遥感影像的各项元平均值
本文介绍基于Python中ArcPy模块,对大量长时间序列栅格遥感影像文件的每一个像元进行多时序平均值的求取. 在遥感应用中,我们经常需要对某一景遥感影像中的全部像元的像素值进行平均值求取-- ...